首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL InnoDB 事務全解析:ACID 特性、隔離級別、MVCC、Redo/Undo 日志與分布式事務

     編輯:MySQL 資料庫相關知識

為什麼需要事務?

經典轉賬場景:A 轉 500 給 B。操作序列:扣款 → 入賬。若扣款後系統崩潰,A 損失 500,B 未收款。**事務確保:要麼全成功,要麼全失敗**。

ACID 四大特性

特性英文核心含義InnoDB 實現機制
原子性Atomicity事務不可分割,全做或全不做Undo Log 回滾
一致性Consistency事務前後數據庫完整性約束保持原子性+隔離性+持久性+約束檢查
隔離性Isolation併發事務互不干擾鎖 + MVCC
持久性Durability提交後永久生效,抗崩潰Redo Log (WAL)

四大隔離級別與並發異常

級別髒讀不可重復讀幻讀InnoDB 默認實現機制
READ UNCOMMITTED✅✅✅否無鎖,直接讀最新
READ COMMITTED❌✅✅否 (Oracle 默認)Read View 每語句重建
REPEATABLE READ❌❌❌*✅ (MySQL 默認)Read View 事務首次建立 + Gap Lock
SERIALIZABLE❌❌❌否讀加共享鎖,寫加排他鎖,串行執行

* InnoDB RR 級別通過 **Gap Lock(間隙鎖)+ Next-Key Lock** 解決幻讀,實際達到串行化效果但保留並發性能。

MVCC 多版本併發控制核心原理

隱藏列

-- 每行隱含
DB_TRX_ID   -- 最後修改事務 ID
DB_ROLL_PTR -- 指向 Undo Log 版本鏈
DB_ROW_ID   -- 無主鍵時生成單調遞增 ID

Read View 判斷可見性

Read View 包含:
- m_ids: 活躍事務 ID 列表
- min_trx_id: 最小活躍事務 ID
- max_trx_id: 最大已分配事務 ID + 1
- creator_trx_id: 創建該 Read View 的事務 ID

可見性判斷:
1. trx_id < min_trx_id          → 可見 (已提交)
2. trx_id >= max_trx_id         → 不可見 (未來事務)
3. min_trx_id <= trx_id < max_trx_id:
   - trx_id 在 m_ids 中         → 不可見 (活躍中)
   - trx_id 不在 m_ids 中       → 可見 (已提交)

RR vs RC 的 Read View 差異

  • RC:每條 SELECT 語句重新構建 Read View → 可見最新提交數據
  • RR:事務首次 SELECT 構建 Read View,全事務複用 → 可重復讀

Redo Log 與 Undo Log:WAL 機制

Redo Log(重做日志):保證持久性

  • 物理日志:記錄頁修改(如:頁 123 偏移 45 寫入 0xABCD)
  • 循環寫入:固定大小文件組,順序 IO,高性能
  • Write-Ahead Logging:事務提交前,Redo Log 必須持久化到磁盤
  • 崩潰恢復:啟動時掃描 Redo Log,重放未刷盤數據

Undo Log(撤銷日志):保證原子性 + MVCC

  • 邏輯日志:記錄反向操作(INSERT → DELETE,UPDATE → 反向 UPDATE)
  • 版本鏈:每行通過 DB_ROLL_PTR 串聯歷史版本
  • Purge 線程:清理不再被任何 Read View 引用的舊版本

事務提交簡化流程

1. START TRANSACTION
2. 修改記錄 → 寫 Undo Log (記錄舊值) → 寫 Redo Log (記錄新值) → 更新內存頁
3. COMMIT 前:將 Redo Log 刷盤 (fsync)  -- 關鍵持久化點
4. COMMIT:標記事務提交,釋放鎖
5. 後台:將內存髒頁刷盤 (Checkpoint)

分布式事務:XA 兩階段提交 (2PC)

模型三角色:
AP (Application)      : 發起全局事務,定義邊界
RM (Resource Manager) : 每個 MySQL 實例,管理本地資源
TM (Transaction Manager): 協調器,如 Atomikos, Seata, Narayana

流程:
Phase 1 (Prepare):
  TM 發送 XA PREPARE 給所有 RM
  RM 執行本地事務至 Prepare 狀態,寫 Redo Log 含 PREPARE 標記,回覆 Ready

Phase 2 (Commit/Rollback):
  若所有 Ready → TM 發 XA COMMIT → RM 提交本地事務
  若任一失敗 → TM 發 XA ROLLBACK → 所有 RM 回滾

風險:TM 單點故障、網絡分區導致阻塞、Heuristic 決定(人工干預)

總結

InnoDB 事務是 **鎖(隔離)+ MVCC(讀不阻寫)+ Redo Log(持久)+ Undo Log(原子+MVCC)** 的精密協作。理解底層原理,才能在死鎖分析、長事務治理、分布式一致性方案選型中做出正確決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved