Maison  >  Article  >  base de données  >  SQLServer 存储过程嵌套事务处理

SQLServer 存储过程嵌套事务处理

WBOY
WBOYoriginal
2016-06-07 15:44:291580parcourir

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

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

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

<span><span>create</span> <span>proc</span><span> proc_example
</span><span>as</span> 
<span>begin</span> 
    <span>--</span><span>声明变量,存放当前已开启的事务数</span>
    <span>declare</span> <span>@exist_trancount</span> <span>int</span>
    <span>select</span> <span>@exist_trancount</span> <span>=</span> <span>@@trancount</span>

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


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

<span>end</span></span>

解释:

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

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

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

 

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

 

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

 

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn