信息技术大学
事务与多版本控制
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
事务与多版本控制
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
ACID 特性与实现手段
事务四性各有靠山:原子靠 undo,持久靠 redo,隔离靠锁与 MVCC,一致是终点。
原子性
失败整体回滚,undo log 记反向操作
持久性
提交不丢,redo log 先落盘支持崩溃重放
隔离性
锁加 MVCC,并发事务互不踩脚
一致性
前三性共同作用达成的最终目标
四隔离级别与三类读问题
隔离级别是防脏读、不可重复读、幻读的三档防线,级别越高并发越低。
读未提交
能读到他人未提交数据,脏读现形
读已提交
只读已提交数据,但两次读结果可能不同
可重复读
同事务内读结果一致,MySQL 默认级别
串行化
完全排队执行,最安全也最慢
MVCC 快照读实现
每行藏着多个版本:undo 链挂历史,ReadView 决定本事务看得见哪一版。
隐藏列
行内带事务 ID 与回滚指针,串成版本链
ReadView
活跃事务快照,逐版本判定可见性
RC 与 RR
RC 每次读新建视图;RR 整个事务复用一个
快照读
普通 SELECT 走 MVCC 免锁,读写互不阻塞
当前读与临键锁
改数据必须读最新版:当前读靠临键锁把间隙也锁住,幻读才被摁住。
当前读
UPDATE/DELETE/SELECT FOR UPDATE 读最新版本
记录锁
锁住索引记录本身
间隙锁
锁住记录之间的空隙,禁止插入
临键锁
记录加间隙的组合,RR 防幻读的主力
本节要点
- ✓原子靠 undo,持久靠 redo
- ✓隔离三档防线,默认可重复读
- ✓MVCC:版本链 + ReadView 免锁读
- ✓当前读上临键锁,幻读才封得住
延伸主题:实验复现不可重复读画一条 undo 版本链
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1可重复读下 MVCC 挡住了幻读,为什么还说「没完全挡住」?
参考答案快照读靠 ReadView 看不见新插入行,但 UPDATE、SELECT FOR UPDATE 这类当前读走最新版本,别的事务新插入的行会现形。临键锁补住缺口,但只覆盖当前读触及的范围。
2undo log 与 redo log 各干什么,为什么不能互相替代?
参考答案undo 记反向操作用于回滚,服务原子性,事务进行中随时要用;redo 记物理修改用于崩溃后重放,服务持久性,提交前必须落盘。一个向后撤销、一个向前重放,方向相反。
3ReadView 生成时机的差异,如何造成 RC 与 RR 的行为区别?
参考答案RC 每次快照读都新建 ReadView,别人刚提交的数据立刻可见,于是不可重复读;RR 只在第一次读时建一次并全程复用,读的始终是同一张快照,结果自然可重复。