經典轉帳場景:A 轉 500 元給 B,需執行「檢查餘額 → A 扣款 → B 入帳」。若扣款後系統崩潰,A 損失 500 而 B 未收到款。事務確保這組操作要麼全成功、要麼全失敗。
| 特性 | 說明 |
|---|---|
| 原子性 | 事務為不可分割的最小單元,操作全做或全不做 |
| 一致性 | 事務執行前後,資料庫完整性約束不被破壞(如總金額不變) |
| 隔離性 | 並發事務互不干擾,具體程度由隔離級別決定 |
| 持久性 | 提交後的資料永久保存,系統崩潰不丟失 |
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | 說明 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✓ | ✓ | ✓ | 最低隔離,幾乎不用 |
| READ COMMITTED (RC) | ✗ | ✓ | ✓ | 多數資料庫預設(Oracle、SQL Server) |
| REPEATABLE READ (RR) | ✗ | ✗ | ✓ | MySQL InnoDB 預設,靠 MVCC + 間隙鎖解決幻讀 |
| SERIALIZABLE | ✗ | ✗ | ✗ | 最高隔離,強制串行,效能最差 |
關鍵差異:
InnoDB 預設 RR,透過 MVCC(多版本並發控制) 解決不可重複讀,配合 間隙鎖 解決幻讀,兼顧並發效能與資料一致性。
InnoDB Log BufferBuffer Pool 中的資料頁非同步刷盤start transaction; 記錄 A=1 到 undo log; update A = 3; 記錄 A=3 到 redo log; 記錄 B=2 到 undo log; update B = 4; 記錄 B=4 到 redo log; 將 redo log 刷盤; commit;
模型包含:應用程式 (AP)、資源管理器 (RM)、事務管理器 (TM)。
InnoDB 原生支援 XA 事務,亦可用訊息佇列實現最終一致性。
事務是訂單、銀行等核心業務的基石。InnoDB 透過 MVCC、間隙鎖、Redo/Undo Log 精妙實現了高效能的 ACID 保證。理解其底層機制,有助於正確設計隔離級別、排查鎖爭用、優化長事務效能。
參考:《高效能 MySQL 第 3 版》、《MySQL 技術內幕:InnoDB 存儲引擎》