尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI 模拟面试实战:MySQL MVCC、ReadView 与 Undo Log 版本链的白板推演

AI 模拟面试实战:MySQL MVCC、ReadView 与 Undo Log 版本链的白板推演 AI 模拟面试实战MySQL MVCC、ReadView 与 Undo Log 版本链的白板推演在各大厂的后端面试中MySQL 的多版本并发控制MVCCMulti-Version Concurrency Control堪称“面试八股之王”。几乎所有候选人都能背出“MVCC 靠的是隐藏字段、Undo Log 版本链和 ReadView”。但一旦面试官在白板上画出 3 个事务的并发时序图并给出一张包含trx_id的记录行让你推演“事务 A 在可重复读RR与读已提交RC下分别能看到哪个版本的值”80% 的同学都会在可见性算法的条件判断上发生混乱。今天我们通过 AI 模拟面试官的硬核追问结合真实案例推演 MVCC 的底层判定流程。MVCC 底层三大基石解构三条隐藏系统字段DB_TRX_ID6 字节记录最后一次插入或修改该行记录的事务 IDDB_ROLL_PTR7 字节回滚指针指向写入undo log的上一个历史版本记录DB_ROW_ID6 字节若表没有主键和唯一索引InnoDB 自动生成的隐藏聚簇索引 ID。Undo Log 版本链每次执行UPDATE或DELETE时旧版本数据被写入 Undo Log并通过DB_ROLL_PTR指针串联成一条从最新版本指向最老版本的单向链表。一致性视图 ReadView事务在执行快照读SELECT时生成的当前活跃事务快照包含 4 个核心属性m_ids生成 ReadView 瞬间系统当前正在活跃且未提交的事务 ID 列表min_trx_idm_ids中的最小值max_trx_id生成 ReadView 瞬间系统即将分配给下一个新事务的 ID即当前已分配最大事务 ID 1creator_trx_id创建当前 ReadView 的事务自身的 ID。ReadView 可见性判定算法流程当事务去访问 Undo Log 版本链上的某个记录版本时提取该版本的trx_id按以下规则判定是否可见graph TD A[提取版本 trx_id] -- B{trx_id creator_trx_id ?} B --|是| C[可见: 是当前事务自己修改的] B --|否| D{trx_id min_trx_id ?} D --|是| E[可见: 说明该版本在生成 ReadView 前已提交] D --|否| F{trx_id max_trx_id ?} F --|是| G[不可见: 说明该版本在生成 ReadView 后才开启] F --|否| H{trx_id 在 m_ids 活跃列表中?} H --|是| I[不可见: 说明生成 ReadView 时该事务尚未提交] H --|否| J[可见: 说明该事务已提交] G -- K[沿 DB_ROLL_PTR 查找上一版本继续判定] I -- K白板实操推演案例假设数据表中有一行记录id 1, name 张三, DB_TRX_ID 50已提交。并发发生如下时序操作10:00:00事务 100 开启更新为name 李四未提交10:00:01事务 200 开启更新为name 王五未提交10:00:02事务 300 开启并提交更新为name 赵六10:00:03事务 400 开启执行第一次SELECT。此时版本链状态[赵六 (trx_id300)] - [王五 (trx_id200)] - [李四 (trx_id100)] - [张三 (trx_id50)]事务 400 生成 ReadViewm_ids [100, 200], min_trx_id 100, max_trx_id 401, creator_trx_id 400推演查询流程访问最新版本赵六 (trx_id300)$300 \ge 100$ 且 $300 401$检查是否在m_ids [100, 200]中 $\to$不在说明事务 300 已经提交。$\to$判定结果事务 400 可以直接读到name 赵六RC 隔离级别与 RR 隔离级别的核心差异在向 AI 追问“RC 与 RR 在 MVCC 实现上的本质区别是什么”时大模型精准提炼出了那句价值千金的话读已提交RCRead Committed每次执行快照读SELECT时都会重新生成一个全新的 ReadView。因此如果其他事务中途提交第二次SELECT就能看到新提交的数据从而产生不可重复读。可重复读RRRepeatable Read仅在事务中的第一次执行快照读SELECT时生成 ReadView后续整个事务生命周期内一直复用该 ReadView。因此无论其他事务后续如何提交本事务看到的永远是第一次查询时锁定的快照状态完美保证了可重复读。实习生面试总结在回答 MVCC 题目时千万不要只背术语。主动在纸上写出[min_trx_id, max_trx_id)区间划分画出DB_ROLL_PTR链条并指出 RC 与 RR 生成 ReadView 的时机差异面试官对你的技术评价立刻就会上升到资深档次。
返回列表