XACT_ABORT 用法

时间:2023-03-08 23:52:12
XACT_ABORT 用法

首先创建一张表

Create Table TranTable
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Priority TINYINT--最大值255
)

1.再执行下面的语句:

set XACT_ABORT ON
  begin tran
      INSERT INTO TranTable  VALUES(1)
      INSERT INTO TranTable VALUES(256)
      INSERT INTO TranTable  VALUES(5)
 commit tran

出现下面的message:

(1 row(s) affected)
Msg 220, Level 16, State 2, Line 4
Arithmetic overflow error for data type tinyint, value = 256.

有一条语句出错整个事务回滚,没有问题

2.当我们设置 set XACT_ABORT OFF

执行后出现下面的Message

(1 row(s) affected)

Msg 220, Level 16, State 2, Line 4 Arithmetic overflow error for data type tinyint, value = 256. The statement has been terminated.

(1 row(s) affected)

每条语句都是各自为事务,没有整个事务回滚

这时候就需要通过捕获异常,回滚事务

Message 信息:

(1 row(s) affected)

(0 row(s) affected)

整个事务回滚

3.执行下面的脚本,注意没有 begin tran

set XACT_ABORT ON

go
 begin
  INSERT INTO TranTable  VALUES(1)
  INSERT INTO TranTable VALUES(256)
  INSERT INTO TranTable  VALUES(5)
 end

Message 信息:

(1 row(s) affected)
Msg 220, Level 16, State 2, Line 4
Arithmetic overflow error for data type tinyint, value = 256.

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

PS:

新建一个连接,执行下面的脚本:

INSERT INTO TranTable  VALUES(1)
  INSERT INTO TranTable VALUES(256)
  INSERT INTO TranTable  VALUES(5)

发现有插进了两条数据

如果执行下面的脚本

INSERT INTO TranTable  VALUES(1)
  select ff from TranTable -- 没有ff这一列
  INSERT INTO TranTable  VALUES(5)

会发现三条语句作为一个事务,整体回滚

也许就应了这句话的解释:在事务中,回滚一个语句还是整个事务视错误的严重程序而定,用户级错误一般不会回滚整个事务

set XACT_ABORT OFF 为默认设置,是否回滚整个事务也是要看错误的级别