存储过程嵌套

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

转载于:https://www.cnblogs.com/GuoQiBuHou/p/3343167.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值