事務可由一條非常簡單的SQL語句組成,也可以有一組復雜的SQL語句組成。事務是訪問並更新數據庫中各種數據項的一個程序執行單元。在事務中操作,要么都做修改,要么都不做,這就是事務的目的,也是事務模型區別與文件系統的重要特征之一
對於InnoDB而言,其默認的事務隔離級別為RR,完全遵循和滿足事務的ACID特性
A(atomicity)原子性,在計算機系統中,每個人都將原子性視為理所當然,例如在C語言中調用SQRT函數,其要么返回正確的平方根值要么返回錯誤的代碼。
然而在數據庫事務中實現調用操作的原子性,就不是那么理所當然了。例如用戶在ATM機前取款的過程稱為原子性操作,要么都做,要么都不做,不能用戶錢未從ATM取得,但是銀行卡的錢已經扣除了,而通過事務模型,可以保證操作的的原子性
原子性是指整個數據庫事務是不可分割工作單位,只有使事務中所有的數據庫操作都執行成功,才算整個事務成功。事務中任何一個SQL語句執行失敗,已經執行成功的SQL語句必須撤回,數據庫狀態應該退回執行事務前的狀態
如果事務中的操作是只讀,要保持原子性是很簡單的,一旦發生任何錯誤,要么重試,要么返回錯誤代碼。因為只讀操作不會改變系統中任何相關部分,但是當事務中的操作需要改變系統中的狀態時,例如插入記錄或更新記錄,那么情況可能就不像只讀操作那么簡單了。如果操作失敗,很有可能引起狀態的變化,因此必須保證保護系統中並發用戶訪問受影響部分數據
C(consistency)一致性 一致性是指事務將數據庫從一種狀態轉變為下一種一致的狀態,在事務開始之前和事務結束以后,數據庫的完整性約束並沒有被破壞。例如,表中有一個字段為姓名,為唯一約束,即在表中中姓名不能重復。如果一個事務對姓名字段進行了修改,但是在事務提交或事務操作發生回滾后,表的姓名變得非唯一了,這就破壞了事務的一致性要求,即事務將從一種狀態變為一種不一致的狀態,因此事務是一致性的單位,如果事務中的某個動作失敗了,系統可以自動撤銷事務---返回初始化狀態
I(isolation)隔離性。隔離性還有其他稱呼,如並發控制(concurrency control)、可串行化(serializability)、鎖(locking)等。事務的隔離性要求每個讀寫事務的對象對其他事務的操作對象能互相分離,即該事務提交對其他事務是不可見的,通常這使用鎖來實現。當前數據庫系統中提供了一種粒度鎖(granular lock)的策略,允許事務鎖住一個實體對象的自己,以此來提高事務之間的並發度
D(durability)持久性事務一旦提交,其結果是永久性的,即發生宕機扥故障,數據庫也能將數據恢復。需要注意的是,只能從事務本身的角度來保證結果永久性。例如,在事務提交后,所有的變化都是永久的。即使當數據庫因為崩潰而需要恢復時,也能保證恢復后提交的數據都不會丟失。但若不是數據庫本身發生故障,而是一些外部原因,如RAID卡損壞、自然災害等原因問題導致數據庫發生問題,那么所有提交的數據都有可能會丟失。因此持久性保證事務系統的高可靠性(High Reliability),而不是高可用性(High Aavilability)。對於高可用性的實現,事務本身並不能保證,需要一些系統共同配合來完成