什么是MVCC机制?

什么是MVCC机制?

什么是MVCC多版本并发控制机制

之前我们讲到,事务在并发环境下会带来脏读、脏写、不可重复读等诸多问题,为了解决这些问题,保证事务的ACID特性,出现了诸多隔离级别去解决这些问题,mysql默认采用的隔离级别是可重复读。那么mysql在可重复读隔离级别下如何保证事务的隔离性?答案是通过MVCC(Multi-Version Concurrency Control)机制来保证。

MVCC多版本并发控制机制如何保证隔离性

既然MVCC机制是用来保证隔离性的,那么它是如何保证隔离性的?是通过undo日志版本链与read view机制

undo日志版本链与read view机制

undo日志版本链

undo日志版本链是指,每个事务在修改完数据以后,记录一下之前的数据及它的事务id,新记录的数据指向之前的数据,形成一条版本链,这样在执行事务时,如果我们读到的不是之前的数据就可以进行回滚。

未命名文件 (2).png read view机制

undo日志版本链给我们提供了事务在不同阶段的执行结果,那么如何知道我们读取的不是之前的数据呢?是通过

read view机制实现的。其过程如下:

未命名文件 (3).png

事务开启后首先生成一个视图数组,由当前未提交事务的最小、最大id和数据库中最大事务的id组成例如[60,80],100

1、如果当前的trx_id小于min_id,落在绿色部分,表示这个版本是已提交的事务生成的,这个数据是可见的。

2、如果当前的trx_id大于max_id,落在蓝色部分,表示这个版本是未提交的事务生成的(只要执行sql就会生成事务id,并不是提交才会生产事务id),这个数据是可见的。

3、如果 当前的 trx_id 落在红色部分(min_id <=trx_id<= max_id),那就包括两种情况

  • 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见。
  • 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。

Guess you like

Origin juejin.im/post/7031445988594319368