知识卡片
Undo Log的本质是MVCC历史版本备份
内容
“Undo Log”这名字易让人误以为是日志,实际更接近”备份数据”:每次修改前先拷贝旧版本存起来,用rollback_ptr把历史版本串成链表,不同事务按开始时间点读取当时最新版本——这正是MVCC的底层实现,也是快照读不加锁支撑高并发查询的原因。历史版本不再被引用即可删除,而非像Redo Log永久追加。发散:认识到Undo Log是数据不是日志,才能理解它天然适合承担隔离性而非回滚。
参考来源
- 位置:第6章《数据库》6.6.2-6.6.3节「Undo Log(MVCC)」「Undo Log不是Log」(源文件:_epub-src/text/part0032.html)
- 结论依据:原文明确说明InnoDB用CopyOnWrite思想,每个事务修改记录前先把记录拷贝一份存入Undo Log,通过rollback_ptr串联历史版本,普通select是不加锁的快照读;并指出Undo Log其实不是日志而是备份数据,历史版本不再被引用即可删除,直接支持卡片论述。
- 原始内容:"InnoDB用的就是CopyOnWrite思想,是在Undo Log里面实现的。每个事务修改记录之前,都会先把该记录拷贝一份出来……更应该把Undo Log叫作记录的'备份数据'……提交事务后,没有其他事务引用历史版本了,就可以删除了。"