SQLServer 存儲過程嵌套事務處理


某個存儲過程可能被單獨調用,也可能由其他存儲過程嵌套調用,則可能會發生嵌套事務的情形。

下面是一種解決存儲過程嵌套調用的通用代碼,在不能確定存儲過程是否可能被其他存儲過程調用的情況下,建議每個存儲過程都按照這個模板建立

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM