if you are careful and use TRY-CATCH around everything, and rollback on errors do you really need to use:
SET XACT_ABORT ON
In other words, is there any error that TRY-CATCH will miss that SET XACT_ABORT ON will handle?
if you are careful and use TRY-CATCH around everything, and rollback on errors do you really need to use:
SET XACT_ABORT ON
In other words, is there any error that TRY-CATCH will miss that SET XACT_ABORT ON will handle?
I believe SET XACT_ABORT ON was a requirement when executing distributed transactions.
From the books on line: XACT_ABORT must be set ON for data modification statements in an implicit or explicit transaction against most OLE DB providers, including SQL Server. The only case where this option is not required is if the provider supports nested transactions. For more information, see Distributed Queries and Distributed Transactions.
Remember that there are errors that TRY-CATCH will not capture with or without XACT_ABORT
.
However, SET XACT_ABORT ON
does not affect trapping of errors. It does guarantee that any transaction is rolled back /doomed though. When "OFF", then you still have the choice of commit or rollback (subject to xact_state). This is the main change of behaviour for SQL 2005 for XACT_ABORT
What it also does is remove locks etc if the client command timeout kicks in and the client sends the "abort" directive. Without SET XACT_ABORT
, locks can remain if the connection remains open. My colleague (an MVP) and I tested this thoroughly at the start of the year.
XACT_ABORT does indeed affect error handling: it will abort the entire batch when an error is encountered, and any code following the line that produced the error (including error checking!) will NEVER execute. There are two exceptions to this behavior: XACT_ABORT is superseded by TRY...CATCH (the CATCH block will always execute, and transactions will NOT be rolled back automatically, only rendered uncommitable), and XACT_ABORT will ignore RAISERROR.
Hi, Can we use XACT_ABORT ON to execute DDL statements, to revert changes in metadata if error occurs? Is there any constraint like that type of statements does not get reverted or mermory issues encounters etc? Moreover if we can do so may i have some code sample for the same? Thanks in advance...
-- Lalit