一,什麼是事務
定義:事務是數據庫操作的最小工作單元,是作爲單個邏輯工作單元執行的一系列操作;這些操作作爲一個整體一起向系統提交,要麼都執行、要麼都不執行;事務是一組不可再分割的操作集合(工作邏輯單元)
作用:用於一些對操作過程的完整性比較高的程序。比如銀行系統,用戶在轉賬的過程中程序出現錯誤,但是這個轉賬操作沒有完成。那麼這個操作就被退回。
二,事務的四大特徵
1. 原子性:
指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇博客介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
2. 一致性:
是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
3.隔離性:
當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
4.持久性:
指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
三,事務的控制語句
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- ROLLBACK TO identifier 把事務回滾到標記點;
- COMMIT 提交事務
- RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常
四,操作實例
Customers表:
注:
Remain爲個人金額
張三轉賬200給李四
--開始事務
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()
set @err_nums=@err_nums+1
end catch
if(@err_nums>0) --說明語句有誤
rollback Transaction tran_Charge --回滾事務
else
commit Transaction tran_Charge --提交事務
*事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啓一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。*