1. 程式人生 > >SQL事務設定SET XACT_ABORT後正確回滾

SQL事務設定SET XACT_ABORT後正確回滾

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