1. MVCC(多版本并發控制)
概念
MVCC(Multi-Version Concurrency Control)是一種數據庫并發控制機制,用于解決 讀寫沖突,提高數據庫并發性能。MySQL InnoDB 存儲引擎使用 MVCC 來實現 非阻塞讀(即讀取時不加鎖)。
核心原理
每行數據在內存中有多個版本。
每個版本包含兩個隱藏列:
trx_id
:記錄創建該版本的事務 ID。roll_pointer
(或undo_pointer
):指向舊版本 Undo Log。
讀取數據時,事務根據 自己的快照版本 決定看到哪個版本的數據。
作用
支持 一致性讀(Consistent Read)
避免讀操作阻塞寫操作
與事務隔離級別結合使用(如 Repeatable Read)
舉例
事務 A 讀取數據時看到的版本是事務開始時的快照
事務 B 更新同一行數據時,會生成新版本,并在 Undo Log 中保存舊版本
事務 A 仍然看到舊版本,不會被阻塞
2. Redo Log(重做日志)
概念
Redo Log 是 InnoDB 的 物理日志,用于 保證事務的持久性(Durability)。
特點
順序寫入磁盤,性能高
數據寫入前先寫 Redo Log,再刷入數據頁(Write-Ahead Logging)
崩潰恢復時,通過 Redo Log 恢復已提交事務的數據
順序流程(插入數據示例)
事務寫入 Redo Log(WAL,順序追加)
數據頁寫入緩沖池
事務提交時,Redo Log 刷盤(保證持久性)
作用
崩潰恢復:只要 Redo Log 存在,已提交的數據可以恢復
提高寫入性能:順序寫比隨機寫快
3. Undo Log(回滾日志)
概念
Undo Log 是 InnoDB 的 邏輯日志,用于 事務回滾 和 MVCC 版本管理。
特點
每條修改操作都會記錄 Undo Log
保存的是舊數據版本
寫操作失敗或事務回滾時,用 Undo Log 恢復數據
作用
事務回滾:事務出錯時,可通過 Undo Log 回到操作前狀態
MVCC 讀:一致性讀時,事務可通過 Undo Log 獲取舊版本數據
示例
數據庫原值:
A = 10
事務修改:
A = 20
Undo Log 保存舊值
A = 10
事務回滾時,用 Undo Log 恢復
A = 10
4. Redo Log vs Undo Log
特性 | Redo Log | Undo Log |
---|---|---|
類型 | 物理日志 | 邏輯日志 |
存儲位置 | 磁盤順序寫 | 內存 + 磁盤 |
用途 | 崩潰恢復 | 回滾、MVCC版本讀取 |
記錄內容 | 新數據 | 舊數據 |
持久性 | 持久化(保證事務提交) | 臨時(事務回滾后可釋放) |
5. 總結
MVCC:保證高并發下的一致性讀,靠 Undo Log 保存歷史版本
Redo Log:保證事務提交的持久性,順序寫入磁盤
Undo Log:支持事務回滾和 MVCC 版本管理
理解技巧:
Redo Log = Ctrl+S(存儲最新修改,保證不會丟)
Undo Log = Ctrl+Z(保存歷史版本,可以撤回操作)
MVCC = 時間旅行(每個事務看到自己時間點的版本)