我对 mysql 的 mvcc 的理解

mvcc的作用及原理

mvcc 即 multiversion concurrency controller,多版本并发控制,是数据库隔离事务的一种实现方法,不同的事务读取的逻辑上的同一行,但实际上是同一行的多个不同版本。一行数据还有几个隐含字段

字段名 说明
ROW_ID 标记行号
DB_TRX_ID 事务id
DB_ROLL_PTR 上一个版本的记录号(回滚指针)

可重复读(RR) 的实现原理

事务开始,执行第一条语句后,即建立了当前数据的快照(应该是逻辑上的快照)。读取到一行数据时,如何判断这行数据对于当前事务是否可见?在RR 隔离级别下,要保证 只读取到当前事务开始前就已经提交了的数据。这里利用了事务id
事务开始时,记录当前系统中的活动事务id记录下来,作为 read view。的最早事务号(t_min)和最晚事务号(t_max),当前数据行的事务号为t_x。

  • t_x < t_min ,说明是事务开始前已经提交,可见
  • t_min < t_x < t_max ,则检查t_x是否在 read_view中,如果不在,则说明是事务开始前就已经提交的数据,可见。否则,根据该行数据的回滚指针,找到它的上一个版本,重新开始这个判断逻辑
  • t_x > t_max,说明是事务开始后,新启动的事务,是不可见的。同样按照DB_ROLL_ID回溯查找上一个版本,循环这个判断逻辑。

读取已提交(RC) 的实现原理

RC隔离级别同样是利用了 事务READ_VIEW + 数据行的 TRX_ID ,不同的是 RC 级别下每执行一条语句前,都会重新构建 READ_VIEW,于是实现了事务中读取已提交数据行。

参考 https://blog.csdn.net/bosiyan/article/details/77480236
本文是基于上面这篇博文的理解,原文中 附带有图片,更加有助于理解。

你可能感兴趣的:(mysql)