好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLServer存储过程嵌套事务处理

某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形。 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否可能被其他存储过程调用的情况下,建议每个存储过程都按照这个模板建立 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)最后,如果处理正确执行,并且非嵌套调用,则提交事务;如果发生错误,则回滚事务或者回滚保存点。

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

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

查看更多关于SQLServer存储过程嵌套事务处理的详细内容...

  阅读:53次