存储过程嵌套

时间:2022-09-08 12:03:59

sql server事务计数器 @@trancount
begin tran 计数器+1
save tran 保存事务点,计数器不变
commit tran 计数器-1
rollback tran 回滚最外层事务或者指定的事务点,在嵌套事务中回滚子事务会报错误"无法回滚Tran1。找不到该名称的事务或保存点"

参考:http://www.cnblogs.com/yangpei/archive/2010/10/07/1894408.html

在处理嵌套事务时,要特别注意,不论如何要确保事务被完整的关闭或被回滚! 
回滚比较好控制。无论有多少级事务数,只要ROLLBACK 一次就可以。不过如果是ROLLBACK TRAN TRANNAME,TranName不是第一级的话,则会出现异常,等于没有执行ROLLBACK操作。 
提交就要特别注意了。BEGIN TRAN 创建事务3个,则必须COMMIT TRAN 提交事务3次,才能确保事务数被完整提交。可以通过@@TRANCOUNT来查看当前事务数。一旦存储过程没有完整提交事务,则可能出现事务锁表的情况!

比如(正确用法)
create proc p_Proc1
as
begin
begin try
declare @transcount int
set @transcount = @@trancount
if @transcount > 0
begin
    save tran T1
end
else
begin
    begin tran T1
end
……
if @transcount = 0
begin
    commit tran T1
end
end try
begin catch
    print '错误号:'+Convert(nvarchar(50),ERROR_NUMBER())
    print '错误消息:'+ERROR_MESSAGE()
    print '错误严重性:'+Convert(nvarchar(50),ERROR_SEVERITY()) 
    print '错误状态号:'+Convert(nvarchar(50),ERROR_STATE()) 
    print '错误的例程中的行号:'+Convert(nvarchar(50),ERROR_LINE())
    print '错误的存储过程或触发器的名称:'+ERROR_PROCEDURE()
    rollback tran T1
end catch
end