Share via


SET XACT_ABORT (Transact-SQL)

[!附註]

THROW 陳述式接受 SET XACT_ABORT,RAISERROR 則否。 新應用程式應該改用 THROW,以取代 RAISERROR。

指定當 Transact-SQL 陳述式產生執行階段錯誤時,SQL Server 是否自動回復目前的交易。

主題連結圖示 Transact-SQL 語法慣例

語法

SET XACT_ABORT { ON | OFF }

備註

當 SET XACT_ABORT 是 ON 時,如果 Transact-SQL 陳述式產生執行階段錯誤,就會終止和回復整個交易。

當 SET XACT_ABORT 是 OFF 時,在某些情況下,只會回復產生錯誤的 Transact-SQL 陳述式,交易會繼續進行。 隨著錯誤嚴重性而不同,即使 SET XACT_ABORT 是 OFF,也有可能回復整個交易。 OFF 是預設值。

SET XACT_ABORT 不會影響到如語法錯誤之類的編譯錯誤。

針對大部分 OLE DB 提供者 (包括 SQL Server) 的隱含或明確的交易,其中之資料修改陳述式的 XACT_ABORT 都必須設為 ON。 只有在提供者支援巢狀交易時,才不需要這個選項。

當 ANSI_WARNINGS=OFF 時,若違反使用權限會導致交易中止。

SET XACT_ABORT 的設定是在執行階段進行設定,而不是在剖析階段進行設定。

範例

下列程式碼範例會使有其他 Transact-SQL 陳述式的交易發生外部索引鍵違規錯誤。 在第一組陳述式中,會產生錯誤,但其他陳述式仍能順利執行,且會順利確認交易。 在第二組陳述式中,SET XACT_ABORT 設為 ON。 這會使陳述式錯誤終止批次,且會回復交易。

USE AdventureWorks2012;
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

請參閱

參考

THROW (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT TRANSACTION (Transact-SQL)

ROLLBACK TRANSACTION (Transact-SQL)

SET 陳述式 (Transact-SQL)

@@TRANCOUNT (Transact-SQL)