什麼是事務
事務就是被綁定在一起作爲一個邏輯工作單元的SQL語句組,如果任何一個語句操作失敗那麼整個操作就被失敗,進而回滾到操作前狀態,或者是上個節點。爲了確保要麼執行,要麼不執行,就可以使用事務。要將一組語句作爲事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
事務模式的分類
SQL Server 以下列事務模式運行:
自動提交事務
每條單獨的語句都是一個事務。
顯式事務
每個事務均以 BEGIN TRANSACTION 語句顯式開始,以 COMMIT 或 ROLLBACK 語句顯式結束。
隱式事務
在前一個事務完成時新事務隱式啓動,但每個事務仍以 COMMIT 或 ROLLBACK 語句顯式完成。
批處理級事務
只能應用於多個活動結果集 (MARS),在 MARS 會話中啓動的 Transact-SQL 顯式或隱式事務變爲批處理級事務。 當批處理完成時沒有提交或回滾的批處理級事務自動由 SQL Server 進行回滾。
事務的使用示例
我們以一張表爲例演示事務的使用。
給Customer表的Remain字段添加一個約束。
--張三給--李四轉賬 200
select*from Customer
go
--定義一個變量,記錄錯誤數
declare @error_nums int
set @error_nums=0
--開始事務
begin transaction tran_change
begin try
update customer set Remain=Remain-200 where id=1
set @error_nums=@error_nums+@@error
update customer set Remain=Remain+200 where id=2
set @error_nums=@error_nums+@@error
end try
begin catch
set @error_nums=@error_nums+1
print'錯誤異常:'+convert(varchar,error_number())+',錯誤信息'+error_message()
end catch
if(@error_nums>0) --表示前面有錯
rollback transaction tran_change --回滾事務
else
commit transaction tran_change --執行事務
select*from Customer
--注:
--@@ERROR:當前一個語句遇到錯誤,則返回錯誤號,否則返回0。
--需要注意的是@ERROR在每一條語句執行後會被立刻重置,
--因此應該在要驗證的語句執行後檢查數值或者是將它保存到局部變量中以備將來使用。
--沒使用事務,對的就執行,錯誤的就不執行