SQL事務的使用

2021-09-07 07:40:24 字數 2009 閱讀 8592

在 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...