解决办法一:    

在begin transaction 前面加set xact_abort on

这样就可以在过程出错时中断执行,当然也就不能commit了,如此再在最后一个操作的后面加入 if @error=0 就说明所有的操作都执行成功了就可以commit。

具体如:

  set xact_abort on
begin trans
declare ...
<1>操作
<2>操作
...
<n>操作
if @error<>0
begin
rollback transaction
end
else
begin
commit transaction
end
end

 解决办法二:
   不加 set xact_abort on 而是声明一个记录错误的变量
   比如: 

    begin trans
declare @nror int
set @nror=0
<1>操作
set @nror=@nror+@@error
<2>操作
set @nror=@nror+@@error
...
<n>操作
set @nror=@nror+@@error
if @ror<>0
begin
rollback transaction
end
else
begin
commit transaction
end
end

显然这样在每一个操作的背后都要加入一个记录错误的操作 
最后再判断错误是不是0,如果不是则说明过程中某一步出了错,就不commit了。     
这比第一种方法在烦一点。

 

版权声明:本文为leonkin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/leonkin/archive/2012/02/22/2363814.html