天天看點

SET XACT_ABORT { ON | OFF }SQL Server 是否自動復原到目前事務文法備注

指定當 Transact-SQL 語句出現運作時錯誤時,SQL Server 是否自動復原到目前事務。

SET XACT_ABORT { ON | OFF }SQL Server 是否自動復原到目前事務文法備注

Transact-SQL 文法約定

SET XACT_ABORT { ON | OFF }SQL Server 是否自動復原到目前事務文法備注
文法

SET XACT_ABORT { ON | OFF }      

SET XACT_ABORT { ON | OFF }SQL Server 是否自動復原到目前事務文法備注
備注

當 SET XACT_ABORT 為 ON 時,如果執行 Transact-SQL 語句産生運作時錯誤,則整個事務将終止并復原。

當 SET XACT_ABORT 為 OFF 時,有時隻復原産生錯誤的 Transact-SQL 語句,而事務将繼續進行處理。如果錯誤很嚴重,那麼即使 SET XACT_ABORT 為 OFF,也可能復原整個事務。

編譯錯誤(如文法錯誤)不受 SET XACT_ABORT 的影響。

對于大多數 OLE DB 提供程式(包括 SQL Server),必須将隐式或顯示事務中的資料修改語句中的 XACT_ABORT 設定為 ON。唯一不需要該選項的情況是在提供程式支援嵌套事務時。有關詳細資訊,請參閱分布式查詢和分布式事務。

SET XACT_ABORT 的設定是在執行或運作時設定,而不是在分析時設定。

示例

下列代碼示例導緻在含有其他 Transact-SQL 語句的事務中發生外鍵沖突錯誤。在第一個語句集中産生錯誤,但其他語句均成功執行且事務成功送出。在第二個語句集中,将

SET XACT_ABORT

設定為

ON

。這導緻語句錯誤使批處理終止,并使事務復原。

SET XACT_ABORT { ON | OFF }SQL Server 是否自動復原到目前事務文法備注
複制代碼
USE AdventureWorks;
GO
IF OBJECT_ID(N't2', N'U') IS NOT NULL
    DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
    DROP TABLE t1;
GO
CREATE TABLE t1
    (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
    (a INT NOT NULL 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 TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.
INSERT INTO t2 VALUES (6);
COMMIT TRANSACTION;
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      

繼續閱讀