代码改变世界

SQLServer 存储过程嵌套事务处理

  JentleWang  阅读(6660)  评论(0编辑  收藏  举报

某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形。

下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否可能被其他存储过程调用的情况下,建议每个存储过程都按照这个模板建立

复制代码
create proc proc_example
as 
begin 
    --声明变量,存放当前已开启的事务数
    declare @exist_trancount int
    select @exist_trancount = @@trancount

    if @exist_trancount > 0
        --创建事务保存点
        save transaction tran_proc
    else
        --开启新事务
        begin transaction tran_proc
        
    /*
        存储过程业务处理代码
        ·········
    */
    if @@error<>0
        goto error


    if @exist_trancount = 0
        --提交事务
        commit tran tran_proc
        return 1
    error:
        --回滚事务或者事务保存点
        rollback transaction tran_proc
        return -1

end
复制代码

解释:

1) 首先判断当前存储过程实例执行是否是嵌套事务调用。如果是嵌套,则存储过程判断的@@TRANCOUNT应该大于0,此时创建一个事务保存点,而非开启新事务;如果不是嵌套事务,则@@TRANCOUNT应该为0,此时开启新事务即可

2)然后,是存储过程本身的业务处理代码,每一步处理代码需要判断@@ERROR,如果<>0,执行error代码

3)最后,如果处理正确执行,并且非嵌套调用,则提交事务;如果发生错误,则回滚事务或者回滚保存点。

 

当然调用存储过程的地方,需要判断存储过程的返回值来做相应的处理

 

如有不对的地方,欢迎拍砖;如有其他方法,求分享,谢谢!O(∩_∩)O

 

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示