sql server事务中语句报错后,事务实际状态测试总结,请看看是否正确?
我自己对asp.net 后台如何写事务一直感到疑惑,原因是何时使用回滚以及是否可以回滚成功(可能会失败哦)一直比较烦恼,
今天特地在SQL SERVER查询分析器中对事务报错后的情况作了仔细测试分析,得出如下总结,希望高手看过后发现错误,给予指正,搞清了这个原理,再后台写事务就能正确把握使用回滚了,谢谢了,以下为总结全文:
在sql server查询分析器中
一个事务中碰到错误的SQL 语句时:按错误语句类型分为如下四种情况
1、如果报错的语句是insert语句
这个时候如果xact_abort 为off(默认)的话,那么仅自动回滚该出错的语句,对事务其余部分不会
产生任何影响,就是等于把错误的SQL语句删除后再运行的话,跟删除前运行的效果是一样的。
如果是ON的话,那么立即终止整个事务,并且回滚整个事务
2、如果碰到报错的语句是update语句
那么这个时候无论xact_abort是什么值,都按xact_abort=ON时的效果处理,就是立即终止
事务并回滚整个事务
3、如果碰到报错的语句是select语句
那么无论xact_abort是什么值,事务中其余语句都不会执行(感觉好象都是先执行select语句
再考虑执行其它语句的),并且事务自动终止,由于其余语句都没试行,所以没必要考虑回滚
4、如果碰到报错语句是delete语句
这个时候如果xact_abort 为ON的话,那么立即终止整个事务,并且回滚整个事务,
如果xact_abort 为OFF(默认)的话,那么在语句报错后,事务就停止在那里,
注:查看当前事务状态可以用xact_state()函数
[解决办法]
说的是正确的啊 总结得不错
[解决办法]
SET XACT_ABORT
指定当 Transact-SQL 语句产生运行时错误时,Microsoft? SQL Server? 是否自动回滚当前事务。
语法
SET XACT_ABORT { ON
[解决办法]
OFF }
注释
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。
[解决办法]
怎么没说commit和rollback
[解决办法]
mark
[解决办法]
set xact_abort off
begin tran
select 1/0
print 'will be prited!'
commit tran
if object_id('ta') is not null
drop table ta
go
create table ta(col1 int, col2 char)
go
set xact_abort off
begin tran
insert into ta
values(1/0, 'c')
print 'will been printed'
insert into ta
values(convert(int, 'ac'), 'd')
print 'will not been printed'
commit tran
LZ总结的不错。
[解决办法]
create table tb01 (ID int primary key,DESCR char(10))
insert into tb01 select 1,'A' union all select 2,'B'
select * from tb01
ID DESCR
----------- ----------
1 A
2 B
set xact_abort off -- 关闭 xact_abort 的事务(默认关闭)
begin tran
insert into tb01 select 3,'C'
update tb01 set ID=1 where ID=2 -- 故意制造主键重复错误
insert into tb01 select 4,'D'
commit tran
select * from tb01
ID DESCR
----------- ----------
1 A
2 B
3 C
4 D
-->结果没有如楼主说讲的
"无论xact_abort是什么值,都按xact_abort=ON时的效果处理,就是立即终止事务并回滚整个事务"