首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql server事宜中语句报错后,事务实际状态测试总结,请看看是否正确

2013-01-11 
sql server事务中语句报错后,事务实际状态测试总结,请看看是否正确?我自己对asp.net 后台如何写事务一直感

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
指定当 Transact-SQL 语句产生运行时错误时,Microsoft? SQL Server? 是否自动回滚当前事务。

语法
SET XACT_ABORT { ON 
[解决办法]
 OFF }

注释
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 T……

+
+
[解决办法]

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总结的不错。
[解决办法]

引用:
2、如果碰到报错的语句是update语句

那么这个时候无论xact_abort是什么值,都按xact_abort=ON时的效果处理,就是立即终止
事务并回滚整个事务

不同意楼主总结的第2点喔, 理论就不多说了, 举个反例就行.

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时的效果处理,就是立即终止事务并回滚整个事务"

[解决办法]
还有, 严格来讲, 第3点,第4点未必完全正确. 就不举例了.
个人认为,不必按DML语句来总结事务异常的处理.
SQL Server 2008提供了新语法 Begin try ... End Try ...
也能实现事务过程异常的自动回滚,楼主可以了解一下.
[解决办法]
学习了
[解决办法]
简单来讲,设置set xact_abort=on, 
一旦事务出错,则自动回滚整个事务.(为何不呢)
[解决办法]
把该句写在要执行的存储过程的开头也是可以的呀.

热点排行
Bad Request.