MySQL | 一致性视图

什么是一致性视图

在MySQL中说起视图,普遍知道是 view,它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 create view … ,而它的查询方法与表一样。
这里要说的是 InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读) 隔离级别的实现。它没有物理结构,作用是事务执行期间用来定义“我能看到什么数据”。

何时创建

  • 可重复读隔离级别:这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。
  • 读提交隔离级别:这个视图是在每个 SQL 语句开始执行的时候创建的。

需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行
化”隔离级别下直接用加锁的方式来避免并行访问。

事务的启动时机。

begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作
InnoDB 表的语句,事务才真正启动。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令

  • 第一种启动方式:一致性视图是在第执行第一个快照读语句时创建的;
  • 第二种启动方式:一致性视图是在执行 start transaction with consistentsnapshot 时创建的

内容

ReadView所解决的问题是使用READ COMMITTED和REPEATABLE READ隔离级别的事务中,不能读到未提交的记录。通过判断一下版本链中的哪个版本是当前事务可见的。

ReadView中主要包含4个比较重要的内容:

  • m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。
  • min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。
  • max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。
  • creator_trx_id:表示生成该ReadView的事务的事务id。

InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。“活跃”指的就是,启动了但还没提交。数组里面事务 ID 的最小值记为低水位,当前系统里面已经创建过的事务 ID 的最大值加 1记为高水位。这个视图数组和高水位,就组成了当前事务的一致性视图(read-view)!
image.png

如何工作

按照下边的步骤判断记录的某个版本是否可见:

  • 如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值大于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。
  • 如果被访问版本的trx_id属性值在ReadView的min_trx_id和max_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

快照读

一个正常的select…语句就是快照读。
快照读,使得在RR(repeatable read)级别下一个普通select...语句也能做到可重复读。即利用一致性视图来做到(当前事务只能读到该事物开启以前已经提交的数据)。

当前读

insert语句、update语句、delete语句、显示加锁的select语句(select… LOCK IN SHARE MODE、select… FOR UPDATE)是当前读。

为什么insert、update、delete语句都属于当前读?

这是因为这些语句在执行时,都会执行一个读取当前数据最新版本的过程。

当前读的SQL语句,InnoDB是逐条与MySQL Server交互的。即先对一条满足条件的记录加锁后,再返回给MySQL Server,当MySQL Server做完DML操作后,再对下一条数据加锁并处理。

# MySQL 

标题:MySQL | 一致性视图
作者:amore
地址:HTTPS://iamwaiting.cn/articles/2020/02/22/1582357826836.html
彧言:  正在加载今日诗词....

评论

取消