某個存儲過程可能被單獨調用,也可能由其他存儲過程嵌套調用,則可能會發生嵌套事務的情形。
下面是一種解決存儲過程嵌套調用的通用代碼,在不能確定存儲過程是否可能被其他存儲過程調用的情況下,建議每個存儲過程都按照這個模板建立
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
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
