在編寫sql server 事務相關的儲存過程**時,經常看到下面這樣的寫法:
begin tranupdate 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 onbegin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
commit tran
go
當xact_abort 選項為on 時,sql server在遇到錯誤時會終止執行並rollback 整個事務。
這個意思是說,如果該事務中包含子事務,子事務也會回滾。
2. 在
每個單獨的dml語句執行後,立即判斷執行狀態,並做相應處理。
begin tranupdate 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 tranbegin 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 onbegin 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,分配此...