事務是數據庫區別於文件系統的核心特性,保證數據在並發、故障場景下的正確性。本文從業務場景切入,系統講解ACID四大特性、四種隔離級別現象與實現、InnoDB底層Redo/Undo機制、MVCC多版本並發控制、間隙鎖解決幻讀、以及分布式事務兩階段提交原理。
經典轉賬場景:A轉賬500元給B
風險: 步驟2成功後系統崩潰 → A扣款但B未到賬 → 數據不一致、資金損失。
事務核心承諾: 要麼全成功,要麼全失敗回滾,不存在中間狀態。
| 特性 | 英文 | 核心含義 | InnoDB實現機制 |
|---|---|---|---|
| 原子性 | Atomicity | 事務是不可分割的最小單元,全做或全不做 | Undo Log 回滾 |
| 一致性 | Consistency | 事務前後數據庫完整性約束保持一致 (如轉賬總金額不變) | 原子性+隔離性+持久性 共同保證 + 應用層邏輯 |
| 隔離性 | Isolation | 並發事務互不干擾,效果如串行執行 | 鎖機制 + MVCC |
| 持久性 | Durability | 提交後的修改永久生效,不因崩潰丟失 | Redo Log WAL (Write-Ahead Logging) |
隔離級別定義了事務間的「可見性」邊界,由低到高:
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 並發性能 | 典型應用 |
|---|---|---|---|---|---|
| READ UNCOMMITTED (RU) | ✅ 可能 | ✅ 可能 | ✅ 可能 | 最高 | 極少用、統計近似值 |
| READ COMMITTED (RC) | ❌ 禁止 | ✅ 可能 | ✅ 可能 | 高 | Oracle/PostgreSQL默認、部分高並發業務 |
| REPEATABLE READ (RR) MySQL默認 | ❌ 禁止 | ❌ 禁止 (MVCC) | ⚠️ 可能 (標準RR) / ❌ 禁止 (InnoDB間隙鎖) | 較高 | MySQL InnoDB默認、大多數業務 |
| SERIALIZABLE | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | 最低 (全鎖) | 極高一致性要求、報表鎖定 |

關鍵理解:
標準 RR 存在幻讀問題,但 InnoDB 通過:
結論: InnoDB RR 實際效果達到 SERIALIZABLE 級別的一致性,但保留了高並發性能 — 這是 InnoDB 核心競爭力所在。
DB_TRX_ID (事務ID)、DB_ROLL_PTR (回滾指鉸) → 串聯歷史版本-- 假設 A=1, B=2 START TRANSACTION; -- 1. 記錄 A=1 到 Undo Log -- 2. UPDATE A = 3 -- 3. 記錄 A=3 到 Redo Log -- 4. 記錄 B=2 到 Undo Log -- 5. UPDATE B = 4 -- 6. 記錄 B=4 到 Redo Log -- 7. Redo Log 刷盤 (fsync) -- 關鍵持久化點 COMMIT; -- 8. Buffer Pool 中髒頁異步刷盤
崩潰場景分析:

-- Phase 1: Prepare (投票階段) XA START 'xid'; -- 業務 SQL... XA END 'xid'; XA PREPARE 'xid'; -- 所有 RM 執行到此,將 Redo Log 持久化,回覆 Ready -- Phase 2: Commit/Rollback (執行階段) -- TM 收集所有 Ready → 發送 Commit XA COMMIT 'xid'; -- 所有 RM 提交 -- 任一 RM 失敗/超時 → 發送 Rollback XA ROLLBACK 'xid'; -- 所有 RM 回滾
關鍵點:
| 場景 | 建議隔離級別 | 關鍵配置/注意點 |
|---|---|---|
| 核心交易/訂單/金融 | RR (InnoDB默認) | 索引優化減少鎖衝突、避免長事務、監控死鎖 |
| 高並發讀多寫少、允許短暫不一致 | RC | binlog_format=ROW、配合MVCC性能更佳 |
| 統計分析/報表、需精確快照 | RR / SERIALIZABLE | 只讀事務加 READ ONLY、合理使用一致性視圖 |
| 跨庫/跨服務業務 | - | 優先最終一致性方案,極少用 XA 2PC |
核心原則:
Innodb_row_lock_waits、Innodb_deadlocks、Trx_rseg_history_len (Undo積壓)