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

请参阅

posted @ 2008-08-21 14:25  roboth  阅读(431)  评论(0)    收藏  举报