某個存儲過程可能被單獨調用,也可能由其他存儲過程嵌套調用,則可能會發生嵌套事務的情形。
下面是一種解決存儲過程嵌套調用的通用代碼,在不能確定存儲過程是否可能被其他存儲過程調用的情況下,建議每個存儲過程都按照這個模板建立
create PRoc proc_exampleas 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 -1end
解釋:
1) 首先判斷當前存儲過程實例執行是否是嵌套事務調用。如果是嵌套,則存儲過程判斷的@@TRANCOUNT應該大于0,此時創建一個事務保存點,而非開啟新事務;如果不是嵌套事務,則@@TRANCOUNT應該為0,此時開啟新事務即可
2)然后,是存儲過程本身的業務處理代碼,每一步處理代碼需要判斷@@ERROR,如果<>0,執行error代碼
3)最后,如果處理正確執行,并且非嵌套調用,則提交事務;如果發生錯誤,則回滾事務或者回滾保存點。
當然調用存儲過程的地方,需要判斷存儲過程的返回值來做相應的處理
如有不對的地方,歡迎拍磚;如有其他方法,求分享,謝謝!O(∩_∩)O
新聞熱點
疑難解答