解决办法一:
在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了。
这比第一种方法在烦一点。