接手人家的一个项目,一个存储过程如下:
set xact_abort on
begin tran
...
if(@@error <> 0)
begin
rollback tran
select '操作失败'
end
...
if(@@error <> 0)
begin
rollback tran
select '系统错误'
end
else
begin
commit tran
select '操作成功'
end
...
if(@@error <> 0)
begin
rollback tran
select '操作失败'
end
...
if(@@error <> 0)
begin
rollback tran
select '系统错误'
end
else
begin
commit tran
select '操作成功'
end
看不明白,只有一个begin tran,后面有多次提交事务。而且提交了事务后又回滚,回滚了以后又提交。这还能正确处理吗?
------解决思路----------------------
大概看了下,虽然是多个提交,但我想根据条件处理,最后应该只有一个会提交或回滚
如果条件处理好的话,能正确执行
------解决思路----------------------
这个问题不大,这个写法是比较老式的写法,也就是 只要@@error 不等于0,那么就会回滚,而这个回滚是全局的,也就是前面做的所有操作 都被回滚了,于是存储过程就终止,返回一个报错的信息了。
另外,在2005及以后的版本,可以建议用 : try catch结构,这个结构在处理异常方面更方便。