事务与多版本控制

官官方信息技术老师·7 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

事务与多版本控制

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

按 空格/→ 演示下一步

问一句
1 / 7 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

事务与多版本控制

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

1第 1 页 · 事务与多版本控制

ACID 特性与实现手段

事务四性各有靠山:原子靠 undo,持久靠 redo,隔离靠锁与 MVCC,一致是终点。

原子性
失败整体回滚,undo log 记反向操作
持久性
提交不丢,redo log 先落盘支持崩溃重放
隔离性
锁加 MVCC,并发事务互不踩脚
一致性
前三性共同作用达成的最终目标
2第 2 页 · ACID 特性与实现手段

四隔离级别与三类读问题

隔离级别是防脏读、不可重复读、幻读的三档防线,级别越高并发越低。

读未提交
能读到他人未提交数据,脏读现形
读已提交
只读已提交数据,但两次读结果可能不同
可重复读
同事务内读结果一致,MySQL 默认级别
串行化
完全排队执行,最安全也最慢
3第 3 页 · 四隔离级别与三类读问题

MVCC 快照读实现

每行藏着多个版本:undo 链挂历史,ReadView 决定本事务看得见哪一版。

隐藏列
行内带事务 ID 与回滚指针,串成版本链
ReadView
活跃事务快照,逐版本判定可见性
RC 与 RR
RC 每次读新建视图;RR 整个事务复用一个
快照读
普通 SELECT 走 MVCC 免锁,读写互不阻塞
4第 4 页 · MVCC 快照读实现

当前读与临键锁

改数据必须读最新版:当前读靠临键锁把间隙也锁住,幻读才被摁住。

当前读
UPDATE/DELETE/SELECT FOR UPDATE 读最新版本
记录锁
锁住索引记录本身
间隙锁
锁住记录之间的空隙,禁止插入
临键锁
记录加间隙的组合,RR 防幻读的主力
5第 5 页 · 当前读与临键锁

本节要点

  • ✓原子靠 undo,持久靠 redo
  • ✓隔离三档防线,默认可重复读
  • ✓MVCC:版本链 + ReadView 免锁读
  • ✓当前读上临键锁,幻读才封得住
延伸主题:实验复现不可重复读画一条 undo 版本链
6第 6 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1可重复读下 MVCC 挡住了幻读,为什么还说「没完全挡住」?

参考答案快照读靠 ReadView 看不见新插入行,但 UPDATE、SELECT FOR UPDATE 这类当前读走最新版本,别的事务新插入的行会现形。临键锁补住缺口,但只覆盖当前读触及的范围。

2undo log 与 redo log 各干什么,为什么不能互相替代?

参考答案undo 记反向操作用于回滚,服务原子性,事务进行中随时要用;redo 记物理修改用于崩溃后重放,服务持久性,提交前必须落盘。一个向后撤销、一个向前重放,方向相反。

3ReadView 生成时机的差异,如何造成 RC 与 RR 的行为区别?

参考答案RC 每次快照读都新建 ReadView,别人刚提交的数据立刻可见,于是不可重复读;RR 只在第一次读时建一次并全程复用,读的始终是同一张快照,结果自然可重复。

7第 7 页 · 课后思考