MySQL 是怎么实现可重复读(Repeatable Read)隔离级别的?请详细说一下 MVCC(多版本并发控制)的底层实现细节
由于我现在在准备之后实习所需的东西,所以我决定接下来将开展一期
八股每日一问的形式来复习,并且以这种文章的形式去分享给大家我的理解思路,以及我会如何回答。
好了,今天要分享的是:`Mysql如何实现的Repeatable Read隔离级别?和MVCC多版本并发控制。
在开始之前我们需要了解,Mysql的可重复读解决了什么样的问题?
在Mysql中,RR隔离级别主要解决了是:脏读 和 不可重复读 的问题。他保证了在同一个事物内,对同一条数据进行多次读取的时候,他的数据始终保持一致。
RR隔离级别主要是通过MVCC去实现的。

MVCC的核心实现原理包含三个部分:
1. 隐藏字段
MYsql 默认的 InnoDB 存储引擎会给每条数据后面维护三个隐藏字段,其中和 MVCC 相关的就俩个字段:DB_TRX_ID、DB_ROLL_PTR,分别表示的是:最近一次事务提交的id和指针,指向的是上一个版本的 Undo log。
2. Undo log 版本链
undo log 相当于一个版本链,他记录的是回滚日志,每条数据中都有俩个隐藏字段,trx_id(当前事务id)、roll_pointer(指针:指向上一个版本的undo log)。
InnoDB 当前记录保存最新版本,通过DB_ROLL_PTR指向Undo log的历史版本,多个Undo log通过指针形成版本链。

3. Read View
快照读SQL每次执行的时候,InnoDB都会为它生成一个ReadView,其中包含了四个东西:
之后这个事务再进行 SELECT 就可以获取到该条数据的 DB_TRX_ID (当前事务id)。
使用 DB_TRX_ID 和 Read View 进行比较,通过一些匹配规则去 Undo Log版本链中找到对应的那一个版本。

在不同隔离级别下,ReadView创建的时机也是不一样的。
每一次快照读都会重新生成 Read View,所以 RC 隔离级别下可以读取到别的事务提交的最新数据

只会在第一次快照读的时候生成 ReadView ,后续会复用第一次生成的ReadView,保证了在同一个事物下读取同一条数据始终保持椅子
