SET XACT_ABORT 详解

指定当 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,也可能回滚整个事务。

编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。有关详细信息,请参阅 分布式查询和分布式事务

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。

示例

下列代码示例导致在含有其他 Transact-SQL 语句的事务中发生外键冲突错误。在第一个语句集中产生错误,但其他语句均成功执行且事务成功提交。在第二个语句集中,将 SET XACT_ABORT 设置为 ON。这导致语句错误使批处理终止,并使事务回滚。

复制代码
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

请参阅

你可能感兴趣的:(set)