儲存過程 中的事務 rollback 回滾

2021-06-21 22:02:05 字數 2266 閱讀 8201

在編寫sql server 事務相關的儲存過程**時,經常看到下面這樣的寫法:

begin tran   

update statement 1 ...   

update statement 2 ...   

delete statement 3 ...   

commit tran 

這樣編寫的sql存在很大隱患。請看下面的例子:

create table demo(id int not null)   

go   

begin tran   

insert into demo values (null)  

insert into demo values (2)   

commit tran   

go

執行時會出現乙個違反not null 約束的錯誤資訊,但隨後又提示(1 row(s) affected)。 我們執行select * from demo 後發現insert into demo values(2) 卻執行成功了。 這是什麼原因呢? 原來

sql server在發生runtime 錯誤時,缺省會rollback引起錯誤的語句,而繼續執行後續語句。

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

1. 在事務語句最前面加上set xact_abort on

set xact_abort on   

begin tran   

update statement 1 ...   

update statement 2 ...   

delete statement 3 ...   

commit tran   

go

當xact_abort 選項為on 時,sql server在遇到錯誤時會終止執行並rollback 整個事務。  

這個意思是說,如果該事務中包含子事務,子事務也會回滾。

2. 在

每個單獨的dml語句執行後,立即判斷執行狀態,並做相應處理。

begin tran   

update statement 1 ...  

if @@error 

<

>

0   

begin rollback tran   

goto labend   

end   

delete statement 2 ...   

if @@error 

<

>

0  begin rollback tran   

goto labend   

end   

commit tran   

labend:   

go

3. 在sql server 2005中,可利用 try...catch 異常處理機制。

begin tran   

begin try   

update statement 1 ...   

delete statement 2 ...   

endtry   

begin catch  

if @@trancount 

>

0   

rollback tran   

end catch  

if @@trancount 

>

0   

commit tran  

go

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

create procedure dbo.pr_tran_inproc as 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  

原文出處:

儲存過程中事務操作

資料庫中事務主要應用在多條語句的更新操作 插入 修改 刪除 可以保證資料的完整性與正確性。使用原則為盡可能少的影響資料,以免產生死鎖或者占用資源。在儲存過程中如果中間操作有非嚴重的錯誤資訊執行不會中斷,會繼續執行並返回相應結果。但是程式呼叫的話如果不是用 try catch形式則會報錯,出現黃頁。需...

在儲存過程中實現事務

在圖書館管理系統中系統管理員可以進行的操作有 借 還 新增 刪除 修改圖書或新增 刪除 修改讀者等,很多的操作都涉及到多個表的進行,我們一定要保持資料的一致性。如 刪除讀者 操作,會在讀者表 reader 中進行讀者的刪除,該讀者刪除後,借書表 reader book 也沒有必要再保留該讀者的借書記...

儲存過程中事務try catch 例子

create procedure dbo procaccountmanagerassigncompany 使用者賬號基本資訊表中所需欄位 username nvarchar 50 使用者登入的賬戶名稱 userpwd nvarchar 50 使用者登入的密碼 assignuserid int,分配此...