事務的定義
事務就是被綁定在一起作爲一個邏輯工作單元的SQL語句組,如果任何一個語句操作失敗那麼整個操作就被失敗,進而回滾到操作前狀態,或者是上個節點。爲了確保要麼執行,要麼不執行,就可以使用事務。要將一組語句作爲事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
事務的使用場景
舉個例子,我們經常會使用轉賬功能,轉賬的時候,是先減去轉出自己賬戶的金額,然後再在指定轉入賬戶的金額加上轉出的金額。如果剛好這個時候轉出的操作已經執行完成,但是由於系統的故障,導致轉入的操作失敗了。那麼怎麼辦?這就需要用到事務了,只要事務裏面有一條命令未成功執行,那麼數據就會回滾到事務開始之前的狀態。
事務的特性
(1) 原子性(Atomicity):事務是一個完整的操作, 事務中所有操作命令必須作爲一個整體提交或回滾。如果事務中任何操作命令失敗,則整個事務將因失敗而回滾。
(2) 一致性(Consistency):當事務完成時,數據都處於一致狀態。
(3) 隔離性(Isolation): 對數據進行修改的所有併發事務是彼此隔離的,它不以任何方式依賴或影響其他事務。
(4) 持久性(Durability):事務提交之後,數據是永久性的,不可再回滾。
事務的語法
BEGIN TRAN 事務名 --開始事務
ROLLBACK TRAN --回滾事務
COMMIT TRAN --提交事務
SAVE TRAN --事務保存點
實例講解
實現功能張三給李四轉賬兩百
表結構
Custom表
begin Transaction tran_Charge
--定義變量記錄錯誤數
declare @err_nums int
set @err_nums=0
begin try
update Customers set Remain=Remain-200 where Name='張三'
set @err_nums=@err_nums+@@ERROR
update Customers set Remain=Remain+200 where Name='李四'
set @err_nums=@err_nums+@@ERROR
end try
begin catch
print '錯誤編號:'+convert(varchar,error_number())+'錯誤消息'+error_message()
end catch
if(@err_nums>0) --說明語句有誤
rollback Transaction tran_Charge --回滾事務
else
commit Transaction tran_Charge --提交事務