一、什么是事務
1.事務(Transaction)是區別于數據庫文件系統的重要特性之一。事務會把數據庫從一種一致狀態轉換為另一種一致狀態。在數據庫提交工作時,可以確保要么所有修改都已經保存,要么所有修改都不保存。
2.InnoDB存儲引擎中的事物完全符合ACID的特性。
-
原子性(atomicity)
-
一致性(consistency)
-
隔離性(isolation)
-
持久性(duration)
3.事務是訪問并更新數據庫中各種數據項的一個程序執行單元。在事務中的操作,要么都做修改,要么都不做,這就是事物的目的。
二、ACID的具體描述
4.具體介紹事物的ACID特性:
-
Atomicity:原子性指整個數據庫事務是不可分割的工作單位。只有使事務中所有的數據庫操作都執行成功,才算整個事務成功。事務中任何一個SQL語句執行失敗,已經執行成功的SQL語句也必須撤銷,數據庫狀態應該退回到執行事務前的狀態。
-
Consistency:一致性指將事務從數據庫從一種狀態轉變為下一種一致狀態。在事務開始之前和結束以后,數據庫的完整性約束沒有被破壞。【實體完整性(Primary key/Unique)、參照完整性(Foreign Key)、域完整性(Not Null /check)、用戶自定義完整性(Trigger/Assertion】
-
Isolation:(別名:并發控制(concurrency control)、可串行化(serializability)、鎖(locking))事務的隔離性要求每個讀寫事務的對象對其他事務的操作對象能相互分離,即該事務提交前對其他事務都不可見。
-
Durability:事務一旦提交,其結果就是永久性的。即使發生宕機等故障,數據庫也能將數據恢復。只能從事務本身的角度來保證結果的永久性。【持久性保證的是事務系統的高可靠性(High Reliability),而不是高可用性(High Availability)。
三、事務的分類
-
扁平事務(Flat Transactions)
-
帶有保存點的扁平事務(Flat Transaction with Savapoints)
-
鏈事務(Chained Transactions)
-
嵌套事務(Nested Transactions)
-
分布式事務(Distributed Transactions)
扁平事務:是事務類型中最簡單的一種,但實際生產環境中,這可能是使用最頻繁的事物。主要限制:不能提交或者回滾事務的某一部分,或分幾個步驟提交。
【注:帶有保存點的扁平事務,當發生系統崩潰時,所有的保存點都將消失,因為其保存點是易失的(volatile),而非持久的(persistent)。這意味著當進行數據恢復時,需要從開始處重新執行,而不能從最近的一個保存點繼續開始。】
帶有保存點的事務:除了支持扁平事務支持的操作外,允許在事務執行過程中回滾到同一事務中較早的一個狀態。【保存點Savepoint:用來通知系統應該記住事務當前的狀態,以便當發生錯誤時,事務能回到保存點當時的狀態。保存點能用作內部的重啟動點,根據應用邏輯,決定是回到最近一個保存點還是其他更早的保存點。】
鏈事務:可視為保存點模式的一個變種。在提交一個事務時,釋放不需要的數據對象,將必要的處理上下文隱式地傳給下一個要開始的事務。【提交事務操作和開始下一個事務操作將合并為一個原子操作。】
【注:帶有保存點的扁平事務能回滾到任意正確的保存節點,且不影響迄今為止的所有鎖;而鏈事務中的回滾僅限于當前事務,即只能恢復到最近一個的保存點,且在執行COMMIT后即釋放了當前事務所持有的鎖。】
嵌套事務:是一個層次框架。有一個頂層事務(Top-level transation)控制著各個層次的事務。頂層事務之下嵌套的事務被稱為子事務(subtransaction),其控制每一個局部的變換。【任何子事務都在頂層事務提交后才真正提交】
分布式事務:通常是一個在分布式環境下運行的扁平事務,因此需要根據數據所在位置訪問網絡中的不同節點。
推薦一本書:《MySQL技術內幕InnoDB存儲引擎》姜承堯(著)
上述圖片來自:https://github.com/asdbex1078/MySQL