溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL Server:存儲過程中編寫事務處理的方法小結

發(fā)布時間:2020-06-30 00:47:11 來源:網絡 閱讀:1345 作者:chenhao_asd 欄目:數據庫

/**8. SQLServer存儲過程中編寫事務處理的方法小結**/

原文出處: http://www.jb51.net/article/80636.htm

本文我們介紹了三種不同的方法,舉例說明了如何在存儲過程事務處理中編寫正確的代碼。

1. 常見寫法:

在編寫SQL Server 事務相關的存儲過程代碼時,經??吹较旅孢@樣的寫法

begin tran

update statement 1 ...

update statement 2 ...

delete statement 3 ...

commit tran

 

2. 存在的問題/隱患:

執(zhí)行時會出現一個違反not null 約束的錯誤信息,但隨后又提示(1 row(s) affected)我們執(zhí)行select* from demo 后發(fā)現insert into demo values(2) 卻執(zhí)行成功了。這是什么原因呢? 原來 SQL Server在發(fā)生runtime 錯誤時,默認會rollback引起錯誤的語句,而繼續(xù)執(zhí)行后續(xù)語句。

create table demo(id int notnull)

go

begin tran

insert into demo values (null)

insert into demo values (2)

commit tran

go

3. 如何避免這樣的問題呢?有三種方法

方法1. 在事務語句最前面加上set xact_abort on;當xact_abort 選項為on 時,SQLServer在遇到錯誤時會終止執(zhí)行并rollback 整個事務。

setxact_abort on

begintran

updatestatement 1 ...

updatestatement 2 ...

deletestatement 3 ...

committran

go

方法2. 在每個單獨的DML語句執(zhí)行后,立即判斷執(zhí)行狀態(tài),并做相應處理。

begintran

updatestatement 1 ...

if @@error <>0

beginrollbacktran

gotolabend

end

deletestatement 2 ...

if @@error <> 0

beginrollbacktran

gotolabend

end

committran

labend:

go

方法3. SQL Server 2005中,可利用 try...catch 異常處理機制

begintran

begintry

updatestatement 1 ...

deletestatement 2 ...

endtry

begincatch

if @@trancount >0

rollbacktran

endcatch

if @@trancount >0

committran

go

 

4. 演示:下面是個簡單的存儲過程,演示事務處理過程。

--set nocount on 表示不返回計數

create procedure dbo.pr_tran_inprocas begin set nocount on

begin tran

update statement 1...

if @@error <>0

begin rollback tran

return -1 end

delete statement 2...

if @@error <>0

begin rollback tran

return -1

end commit tran

return 0

end

go

 

執(zhí)行:

Exec dbo.pr_tran_inproc


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI