zoukankan      html  css  js  c++  java
  • 存储过程嵌套模板

    某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形。 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否可能被其他存储过程调用的情况下,建议每个存储过程都按照这个模板建立 create proc proc_exam
     

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

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

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

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

  • 相关阅读:
    洛谷P1600 天天爱跑步——树上差分
    洛谷P1155 双栈排序——思路题
    洛谷P2827 蚯蚓——思路题
    bzoj2763 [JLOI2011]飞行路线——分层图
    洛谷P2831 愤怒的小鸟——贪心?状压DP
    洛谷P1514 引水入城——dfs
    bzoj1854 [Scoi2010]游戏——匈牙利算法
    hdu1814 Peaceful Commission——2-SAT
    浙江理工大学: 铺地砖(3922)
    最大素因子(快)
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5545041.html
Copyright © 2011-2022 走看看