AI 摘要
MVCC(多版本并发控制)是InnoDB引擎实现隔离级别的核心技术,通过隐藏字段、Undo Log版本链和ReadView来解决读写冲突。其可见性判断算法依据事务ID与ReadView的匹配来决定读取哪个版本的数据。已提交读(RC)和可重复读(RR)隔离级别的本质区别在于ReadView的生成时机:RC每次查询都生成新ReadView,而RR只在第一次查询时生成并复用。
首先,什么是MVCC
MVCC 中文名多版本并发控制,它是InnoDB引擎实现隔离级别(主要是已提交读RC和可重复读RR)的核心技术
并发事务有两类冲突:读写冲突和写写冲突
- 读写冲突:事务A在读取某一行数据,事务B同时在修改同一行数据
- 写写冲突:两个事务同时修改同一行数据
写写冲突必须要用锁来保证串行执行,而读写冲突如果也加锁,性能就会变得很差,MVCC就是为了解决读写冲突而设计的
MVCC的三个核心点
- 隐藏字段: 每行记录都有两个关键隐藏列:
trx_id:最后一次修改该记录的事务 ID。roll_pointer:回滚指针,指向该记录在 Undo Log 中的上一个版本。
- Undo Log 版本链: 每次修改记录时,旧版本会被存入 Undo Log,通过回滚指针串联成一个从新到旧的版本链表。
- ReadView (一致性视图): 事务执行查询时产生的快照,包含当前系统中活跃事务(未提交) 的 ID 列表。它是判断“哪个版本对当前事务可见”的依据。
可见性判断算法(ReadView规则)
当一个事务尝试读取版本链中的某条记录时,会根据 trx_id 匹配 ReadView:
- 自己可见:
trx_id==当前事务ID。 - 已提交可见:
trx_id<最小活跃事务ID(说明该版本在查询开始前已提交)。 - 未提交不可见:
trx_id>=预分配事务ID(说明该版本在查询开始后才产生)。 - 活跃中判断: 若
trx_id在活跃事务列表中,则不可见;若不在,说明已提交,可见。
逻辑: 如果当前版本不可见,则顺着
roll_pointer往回找上一个版本,直到找到可见的版本为止。
已提交读RC和可重复读RR的本质区别
- RC(提交读): 每次 SELECT 都会生成一个新的 ReadView。所以能看到其他事务最新提交的结果,存在不可重复读问题。
- RR(可重复读): 只在第一次 SELECT 时生成 ReadView,后续查询复用同一个。所以整个事务期间看到的数据始终一致。
10分钟带你深刻理解MySQL中的MVCC机制
参考引用
喜欢 0
评论区在赶来的路上...