您的位置:首页 > 数据库

SQLServer陷阱(二) 运行时错误与自动回滚事务

2008-06-11 10:21 190 查看
有些人认为一个批查询在执行中发生了错误, 这个查询就会中止, 其实是错误的.

例1:

declare @i int
set @i = 1 / 0
set @i = 1
select @i


结果会先报一个
服务器: 消息 8134,级别 16,状态 1,行 2
遇到被零除错误。
然后输出结果集 1.

例2:

set xact_abort on
declare @i int set @i = 1 / 0 set @i = 1 select @i

结果只报错, 不会输出结果.

例3:
请在查询分析器中新建连接执行

create table table1(id int primary key)

begin tran
insert into table1 values (1)
insert into table1 values (1)
insert into table1 values (2)
commit tran

第二个insert会产生违反主键约束错误, 但是执行结束后你会发现事务已经提交并且table1中已经有两行记录1与2

例4:

set xact_abort on

create table table2(id int primary key)

begin tran
insert into table2 values (1)
insert into table2 values (1)
insert into table2 values (2)
commit tran

执行结束后, table2中没有记录, 说明事务已经回滚.

当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
一般批查询中 SET XACT_ABORT 默认为 OFF, 隐式开启的事务如触发器中SET XACT_ABORT 默认为ON
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: