sql server事務的使用是為了確保數據的一致性。
通常寫法
begin tran --sql 語句1 --sql 語句2 --sql 語句3 commit tran
上面寫法存在隱患,當操作(增刪改)是由null引發的錯誤時,事務會跳過錯誤繼續執行正常的語句。例如:
--創建表Student create table Student(Name nvarchar(20) not null) --建立事務 begin tran inserted into Student(Name) values (null) inserted into Student(Name) values ('小札') inserted into Student(Name) values (null) commit tran --由null引發的錯誤,insert,delete,update都會跳過錯誤繼續執行
上面結果會多一條數據為“小札”。為了避免了這樣的問題:
有三種方法:其中@@error,@@trancount是全局變量,只要發生錯誤,@@error不等於0,只要執行一次事務,@@trancount就+1,回滾會變為0。
【方法一】:xact_abort on/off on:開啟,事務一旦出問題,全部回滾 off:關閉,不檢查事務是否發生錯誤。
set xact_abort on begin tran --sql語句1 --sql語句2 --sql語句3 commit
【方法二】:每條操作語句后面判斷是否回滾。
begin tran --sql語句1 if @@error<>0 begin rollback tran return --這里除了return跳出,也可以使用goto+標簽跳出事務 end --sql語句2 if @@error<>0 begin rollback tran return end commit tran
【方法三】:try catch
begin tran begin try --sql語句1 --sql語句2 --sql語句3 end try begin catch if @@trancount>0 rollback tran end catch if @@trancount>0 commit tran
