内容来自《收割Offer:互联网大厂面经》

面试官提问

● 谈谈你对MySQL MVCC的理解,它解决了什么问题?

● 说一下MVCC的实现原理。

MVCC(Multi-Version Concurrency Control,多版本并发控制)解决了读写不冲突的问题,实现上依赖了Readview和undo版本链。

ReadView存储当前活跃的读写事务列表,也就是开启但还未提交的事务。通过这个读写事务列表来判断记录的某个版本是否对当前事务可见。在读已提交隔离级别下,每次SELECT都会生成最新的Readview;在可重复读隔离级别下,只在事务第一次SELECT时创建一次Readview。undo日志记录了数据被修改的历史版本。下面举例解释MVCC的工作原理。

图1-83展示了读写事务列表的可见区间、临界点。

image.png

图1-83 读写事务列表的可见区间及临界点

● trx_ids:ReadView 初始化时当前未提交的事务列表。

● trx_up_limit_id:当前已提交的事务id加1,若事务 id < trx_up_limit_id,则对于当前事务 ReadView 可见。

● trx_low_limit_id:当前最大的事务id加1,若事务id≥low_limit_id,则对于当前ReadView不可见。