SQLServer 存储过程嵌套事务处理

WBOY
풀어 주다: 2016-06-07 15:44:29
원래의
1579명이 탐색했습니다.

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

 

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!