在 sql server 中資料庫事務處理是個重要的概念,也稍微有些不容易理解,很多 sql 初學者編寫的事務處理**存往往存在漏洞,本文介紹了三種不同的方法,舉例說明了如何在儲存過程事務處理中編寫正確的**。
begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
commit tran
這樣編寫的sql存在很大隱患。請看下面的例子:
create table demo(id int not null)
gobegin 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
enddelete statement 2 ...
if @@error <> 0 begin
rollback tran
goto labend
endcommit tran
labend:
go
3. 在sql server 2005中,可利用 try...catch 異常處理機制
begin tran
begin try
update statement 1 ...
delete statement 2 ...
end try
begin catch
if @@trancount > 0
rollback tran
end catch
if @@trancount > 0
commit tran
go
下面是個簡單的儲存過程,演示事務處理過程。
create procedure dbo.pr_tran_inproc
asbegin
set nocount on
begin tran
update statement 1 ...
if @@error <> 0 begin
rollback tran
return -1
enddelete statement 2 ...
if @@error <> 0 begin
rollback tran
return -1
endcommit tran
return 0
endgo
SQL中事務的使用
事務的使用 select from mr upload manual excel where excel id m000181431 begin tran 開始事務 declare count int 宣告變數 set count 0 變數初始化 update mr upload manual ex...
sql 事務使用
begin tran tran money 開始事務 declare tran error int set tran error 0 begin try update tb money set mymoney mymoney 30 where name 劉備 set tran error tran ...
SQL使用事務
begin transaction 開始事務 declare errorsun int 定義錯誤計數器 set errorsun 0 沒錯為0 update a set id 232 where a 1 事務操作sql語句 set errorsun errorsun error 累計是否有錯 upd...