某個(gè)存儲(chǔ)過(guò)程可能被單獨(dú)調(diào)用,也可能由其他存儲(chǔ)過(guò)程嵌套調(diào)用,則可能會(huì)發(fā)生嵌套事務(wù)的情形。
下面是一種解決存儲(chǔ)過(guò)程嵌套調(diào)用的通用代碼,在不能確定存儲(chǔ)過(guò)程是否可能被其他存儲(chǔ)過(guò)程調(diào)用的情況下,建議每個(gè)存儲(chǔ)過(guò)程都按照這個(gè)模板建立
create
proc
proc_example
as
begin
--
聲明變量,存放當(dāng)前已開(kāi)啟的事務(wù)數(shù)
declare
@exist_trancount
int
select
@exist_trancount
=
@@trancount
if
@exist_trancount
>
0
--
創(chuàng)建事務(wù)保存點(diǎn)
save
transaction
tran_proc
else
--
開(kāi)啟新事務(wù)
begin
transaction
tran_proc
/*
存儲(chǔ)過(guò)程業(yè)務(wù)處理代碼 ·········
*/
if
@@error
<>
0
goto
error
if
@exist_trancount
=
0
--
提交事務(wù)
commit
tran
tran_proc
return
1
error:
--
回滾事務(wù)或者事務(wù)保存點(diǎn)
rollback
transaction
tran_proc
return
-
1
end
解釋?zhuān)?
1) 首先判斷當(dāng)前存儲(chǔ)過(guò)程實(shí)例執(zhí)行是否是嵌套事務(wù)調(diào)用。如果是嵌套,則存儲(chǔ)過(guò)程判斷的@@TRANCOUNT應(yīng)該大于0,此時(shí)創(chuàng)建一個(gè) 事務(wù)保存點(diǎn) ,而非開(kāi)啟新事務(wù);如果不是嵌套事務(wù),則 @@TRANCOUNT 應(yīng)該為0,此時(shí)開(kāi)啟新事務(wù)即可
2)然后,是存儲(chǔ)過(guò)程本身的業(yè)務(wù)處理代碼,每一步處理代碼需要判斷@@ERROR,如果<>0,執(zhí)行error代碼
3)最后,如果處理正確執(zhí)行,并且非嵌套調(diào)用,則提交事務(wù);如果發(fā)生錯(cuò)誤,則回滾事務(wù)或者回滾保存點(diǎn)。
?
當(dāng)然調(diào)用存儲(chǔ)過(guò)程的地方,需要判斷存儲(chǔ)過(guò)程的返回值來(lái)做相應(yīng)的處理
?
如有不對(duì)的地方,歡迎拍磚;如有其他方法,求分享,謝謝!O(∩_∩)O
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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