SET XACT_ABORT 用法

当 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。唯一不需要该选项的情况是在提供程序支持嵌套事务时。有关详细信息,请参阅 分布式查询和分布式事务

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

 

 用法

 

1、总体作为一个事务,整体提交或整体回滚,格式为:
SET XACT_ABORT  ON
BEGIN  TRAN
     -- todo
COMMIT  TRAN
GO
 

2.每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为:

SET XACT_ABORT  ON
BEGIN
     -- todo
END
GO

 

示例

下列代码示例导致在含有其他 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;

 


SET XACT_ABORT ON;
GO
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.事务在错误行终止,错误行回滚,错误行之前的不回滚
INSERT INTO t2 VALUES (6);
GO

 

 

 

 
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值