set xact_abort on 回滚问题本帖最后由 drsheldoncooper 于 2013-03-22 23:31:10 编辑MSSQL2008,运行2段代
set xact_abort on 回滚问题 本帖最后由 drsheldoncooper 于 2013-03-22 23:31:10 编辑 MSSQL2008,运行2段代码: 运行1:
create table a (x char(10),y int) go create trigger [dbo].[a_limit] on [dbo].[a] for insert as if exists(select 1 from inserted where y>0) raiserror('错误',16,1) go set xact_abort on begin tran insert into a values('001',1) insert into a values('002',2) commit tran go --------结果--------- x y 001 1 002 2
运行2:
create table a (x char(10),y int) go create trigger [dbo].[a_limit] on [dbo].[a] instead of insert as if exists(select 1 from inserted where y>1) raiserror('错误',16,1) go set xact_abort on insert into a values('001',1) insert into a values('002',2) go --------结果--------- x y
set xact_abort on begin tran insert into a values('001',1) insert into a values('0032',2) insert into a values('003',3) commit set xact_abort off go select * from a
对例子的理解差不多就是你的意思,下面是联机丛书中的解释,你可以有问题多看看丛书 当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。OFF 是默认设置。
set xact_abort off insert into a values('001',1) insert into a values('0032',2) insert into a values('003',3) go select * from a
set xact_abort on begin tran insert into a values('001',1) --insert into a values('0032',2) raiserror('错误',16,1) insert into a values('003',3) commit set xact_abort off go select * from a
/* (1 行受影响) 消息 50000,级别 16,状态 1,第 5 行 错误
(1 行受影响)
(2 行受影响)
xy 0011 0033 */
这两个例子,1说明xact_abort选项起到了批处理语句是否因错误中断的作用(对比#4第一个例子) 2说明自定义的错误提示只作为一个提示,就如print一样,并没有导致执行 Transact-SQL 语句产生运行时错误,但是raiserror仍然会响应try catch,你如果一定要回滚的话可以用try catch来捕获这个错误提示,手动显示回滚 [解决办法] SET XACT_ABORT ON 是用来保证事务回滚的一致性 举例: SET XACT_ABORT OFF BEGIN TRAN update... table1 ... update... table2 ... update... table3 ... COMMIT TRAN