MySQL 事務處理核心:ACID 特性與隔離級別完整圖解
一、事務通用性
事務非 MySQL 專有,InnoDB 存儲引擎提供完整 ACID 支援。
二、ACID 四大特性
| 特性 | 核心定義 |
| 原子性 | 事務是不可分割的最小工作單元:所有操作要麼全提交,要麼全回滾,不存在部分執行。 |
| 一致性 | 資料庫從一個一致性狀態轉換到另一個一致性狀態(完整性約束、觸發器、外鍵均滿足)。 |
| 隔離性 | 一個事務的修改在提交前對其他事務不可見(具體可見度由隔離級別決定)。 |
| 持久性 | 事務一旦提交,修改永久保存,不會因崩潰丟失(Redo Log 保證)。 |
三、四大隔離級別對比
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 加鎖讀 | 備註 |
| READ UNCOMMITTED | Yes | Yes | Yes | No | 讀未提交,並發最高 |
| READ COMMITTED | No | Yes | Yes | No | 讀已提交,Oracle/PG 預設 |
| REPEATABLE READ | No | No | Yes | No | MySQL InnoDB 預設,MVCC 快照讀 |
| SERIALIZABLE | No | No | No | Yes | 完全串行,並發最低 |
四、現象定義
- 髒讀:讀到其他事務未提交的修改。
- 不可重複讀:同一事務兩次讀同一行,結果不同(被 UPDATE/DELETE)。
- 幻讀:同一事務兩次範圍查詢,行數不同(被 INSERT)。
五、InnoDB 實現細節
- MVCC:REPEATABLE READ 下,事務啟動建立 Read View,普通 SELECT 讀快照,不加鎖。
- Next-Key Lock:範圍查詢加間隙鎖+記錄鎖,最大程度防止幻讀。
- SERIALIZABLE:隱式將 SELECT 轉為
LOCK IN SHARE MODE,讀寫互斥。
六、設定與查看
SELECT @@transaction_isolation; -- 會話級
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 需重連
七、選型指南
- 預設 REPEATABLE READ:絕大多數業務首選。
- READ COMMITTED:高並發、可容忍不可重複讀、需減少間隙鎖衝突(配合
binlog_format=ROW)。
- SERIALIZABLE:極高一致性、低並發報表場景。