​MySQL 百问百答 之 可重复读中的快照

2021-07-23 14:14:35 浏览数 (1)

MySQL 百问百答 之 可重复读中的快照

  1. MySQL 中的视图
  • view 查询语句定义的虚拟表,在调用的时候执行查询语句并生成语句。
  • InnoDB实现MVCC 用的一致性读视图。
  1. 快照在MVCC里是怎么工作的

2.1 什么是快照

在可重复读隔离级别下,事务在启动的时候就拍了快照,这个快照基于整个库。

2.2 快照如何实现

  • InnoDB中每个事务有一个唯一的事务ID,transaction id,在事务开始的时候申请,严格递增。
  • 每行数据有多个版本,事务更新数据的时候,会生成新版本,并把事务ID赋值给该数据的事务ID。
  • 每行数据有两个版本信息:
    • 数据版本 V1,V2 ......
    • 事务版本 事务ID
  • 可重复读的定义是在事务启动和结束的这段期间,数据库的其他更新对当前事务不可见。
  • 可重复读实现原理是,以当前事务启动时刻为准,有事务ID x,如果数据版本 大于x则表示实在事务启动后的新版本数据,则对当前事务不可见。
  • 在事务A启动的时候,InnoDB为其构造了一个数组,保存了事务A启动瞬间,当前活跃的所有事务ID(活跃,事务已经开始,但是还没提交)。
  • 这个数据里面事务ID最小值记为低水位,最大值加1记为高水位。

对于当前事务A:

  • 一个数据的版本小于低水位,则该数据的版本对事务A可见。
  • 一个数据的版本大于高水位,则该数据的版本对事务A不可见。
  • 如果数据的版本落在黄色区域:
    • 数据的版本在活跃事务数组中,表示该数据的版本还没提交,对当前事务A不可见。
    • 反之,对当前事务A可见。

0 人点赞