某個存儲過程可能被單獨調用,也可能由其他存儲過程嵌套調用,則可能會發生嵌套事務的情形。
下面是一種解決存儲過程嵌套調用的通用代碼,在不能確定存儲過程是否可能被其他存儲過程調用的情況下,建議每個存儲過程都按照這個模板建立
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
