java面试必问18:MVCC 原理简述:从版本链到一致性视图,读懂就变高手

MVCC 原理简述:从版本链到一致性视图,一篇讲透

面试官:“MVCC 是什么?它是如何实现可重复读的?”
你:“MVCC 是多版本并发控制,InnoDB 通过 undo log 版本链 + read view 实现。写操作生成新版本,读操作根据 read view 选择可见版本,读写不互斥,大大提高了并发性能。在可重复读级别下,事务启动时生成一致性视图,整个事务复用该视图。”
面试官:“那 read view 具体包含哪些信息?RC 和 RR 在生成 read view 上有什么区别?”
你:“……”

很多人知道 MVCC 可以解决不可重复读,但一追问底层版本链如何组织、read view 的可见性判断规则就含糊了。本文从源码角度,彻底讲透 InnoDB MVCC 的实现原理。


一、什么是 MVCC?

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种无锁并发控制技术。它允许事务在读取数据时,不加锁也能看到某个时间点的数据快照,从而避免“读-写”冲突,提升数据库的并发性能。

InnoDB 的 MVCC 主要用于实现 RC(读已提交)RR(可重复读) 两种隔离级别,是 InnoDB 默认使用 RR 级别的底层支撑。


二、MVCC 依赖的三个核心组件

1. 隐藏字段

InnoDB 中,每行数据除了用户定义的列,还有三个隐藏字段:

隐藏字段 说明
DB_TRX_ID 最后一次修改该行的事务 ID(6 字节)
DB_ROLL_PTR 回滚指针,指向 undo log 中该行的旧版本记录(7 字节)
DB_ROW_ID 行 ID,当表没有主键和唯一索引时,InnoDB 用它生成聚簇索引(6 字节)

DB_TRX_IDDB_ROLL_PTR 是 MVCC 的关键。

2. Undo Log 版本链

当对某行数据执行 UPDATEDELETE 时,InnoDB 会将该行的旧版本写入 undo log,同时更新当前行的 DB_TRX_ID 为新事务 ID,DB_ROLL_PTR 指向 undo log 中的旧版本记录。多个旧版本通过 DB_ROLL_PTR 串联起来,形成一个 版本链,从当前版本可以回溯到最早的版本。

例如,初始行:(id=1, name='A', age=10)DB_TRX_ID=100DB_ROLL_PTR=null

事务 101 执行 UPDATE SET age=20

  • 将旧版本 (id=1, name='A', age=10) 写入 undo log,记录 DB_TRX_ID=100DB_ROLL_PTR=null
  • 更新当前行:name='A', age=20DB_TRX_ID=101
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zmsofts

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值