在数据库系统中,Undo 日志(回滚日志)对 MVCC(多版本并发控制,Multi-Version Concurrency Control) 起着核心支撑作用。可以从“是什么、为什么需要、怎么起作用”三个层面理解。
Undo 日志记录了数据修改前的旧值(历史版本),用于:
例如:
UPDATE users SET age=30 WHERE id=1;
Undo 日志会记录:
(旧值) id=1, age=20
MVCC 通过保存数据的多个版本,让:
实现方式通常包括:
MVCC 的读操作(如 SELECT)需要看到事务开始时的数据快照:
✅ 没有 Undo 日志,就无法构造历史版本
每一行数据通常包含:
trx_id(最后修改的事务ID)roll_ptr(指向 Undo 日志的指针)版本链示例:
当前行 (age=30, trx_id=102)
↓ roll_ptr
Undo (age=20, trx_id=100)
↓ roll_ptr
Undo (age=18, trx_id=95)
MVCC 读时:
顺着版本链,找到第一个“对自己可见”的版本
这是依靠:
Undo 日志 + 事务ID 可见性判断
常见 SQL:
SELECT * FROM users;
| 隔离级别 | Undo 日志作用 |
|---|---|
| Read Committed | 每次读都找最新可见版本 |
| Repeatable Read | 整个事务复用同一快照(Undo 支撑) |
| Serialization | 通常加锁,Undo 作用减弱 |
Undo 日志是 MVCC 的“版本仓库”
没有 Undo 日志,MVCC 就无法实现多版本、快照读和高效并发。
如果你愿意,我也可以结合 InnoDB 的具体实现(隐藏列 + ReadView) 或 Redo / Undo 对比 再讲一层。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。