指定當 Transact-SQL 陳述式產生執行階段錯誤時,Microsoft SQL Server 是否自動復原當前事務。
文法
SET XACT_ABORT { ON | OFF }
注釋
當 SET XACT_ABORT 為 ON 時,如果 Transact-SQL 陳述式產生執行階段錯誤,整個事務將終止並復原。為 OFF 時,只復原產生錯誤的 Transact-SQL 陳述式,而事務將繼續進行處理。編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。
對於大多數 OLE DB 提供者(包括 SQL Server),隱性或明確交易中的資料修改語句必須將 XACT_ABORT 設定為 ON。唯一不需要該選項的情況是提供者支援嵌套事務時。有關更多資訊,請參見分散式查詢和分散式交易。
SET XACT_ABORT 的設定是在執行或運行時設定,而不是在分析時設定。
樣本
下例導致在含有其它 Transact-SQL 陳述式的事務中發生違反外鍵錯誤。在第一個語句集中產生錯誤,但其它語句均成功執行且事務成功提交。在第二個語句集中,SET XACT_ABORT 設定為 ON。這導致語句錯誤使批處理終止,並使交易回復。
CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /**//* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO
SET XACT_ABORT ON
GO
BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /**//* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO
/**//* Select shows only keys 1 and 3 added.
Key 2 insert failed and was rolled back, but
XACT_ABORT was OFF and rest of transaction
succeeded.
Key 5 insert error with XACT_ABORT ON caused
all of the second transaction to roll back. */
SELECT *
FROM t2
GO
DROP TABLE t2
DROP TABLE t1
GO