在 sql server 中資料庫事務處理是個重要的概念,也稍微有些不容易理解,很多 sql 初學者編寫的事務處理**存往往存在漏洞,本文介紹了三種不同的方法,舉例說明了如何在儲存過程事務處理中編寫正確的**。
這樣編寫的sql存在很大隱患。請看下面的例子:begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
commit tran
執行時會出現乙個違反 not null 約束的錯誤資訊,但隨後又提示(1 row(s) affected)。 我們執行 select * from demo 後發現 insert into demo values(2) 卻執行成功了。 這是什麼原因呢? 原來 sql server 在發生 runtime 錯誤時,缺省會 rollback 引起錯誤的語句,而繼續執行後續語句。create table demo(id int not null)
gobegin tran
insert into demo values (null)
insert into demo values (2)
commit tran
go
如何避免這樣的問題呢?有三種方法:
1. 在事務語句最前面加上set xact_abort on
當 xact_abort 選項為 on 時,sql server 在遇到錯誤時會終止執行並 rollback 整個事務。set xact_abort on
begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
commit tran
go
2. 在每個單獨的dml語句執行後,立即判斷執行狀態,並做相應處理。
3. 在sql server 2005中,可利用 try...catch 異常處理機制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
下面是個簡單的儲存過程,演示事務處理過程。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...