MySQL 百问百答 之 可重复读中的快照
- MySQL 中的视图
- view 查询语句定义的虚拟表,在调用的时候执行查询语句并生成语句。
- InnoDB实现MVCC 用的一致性读视图。
- 快照在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可见。