MVCC详解
目录
undo日志版本链
read view一致性视图
MVCC过程分析
读事务&写事务
- Multi-Version Concurrency Control,多版本并发控制
- 在读已提交和可重复读隔离级别下都实现了MVCC机制
undo日志版本链
- 一行数据被修改后,MySQL会保留修改前的数据(undo日志)
- 并使用trx_id和roll_pointer把这些undo日志串联形成一个历史记录版本链
read view一致性视图
- 在可重复读隔离级别下,开启事务后,执行任何查询sql是会生成当前事务的一致性视图,该视图在事务结束之前永远都不会发生变化
- 在读已提交隔离级别下,每次执行查询sql是都会重新生成一致性视图
- 一致性视图由执行查询时所有为提交的事务id数组以及已创建的最大的事务id(max_id)组成
- 未提交的事务id数组中存在最小的事务id(min_id)
- 事务中任务sql查询结果需要使用查询记录中提交的trx_id和一致性视图作对比,决定记录是否对当前事务可见
- 其据图的对比规则如下
- 当记录的trx_id<min_id时,说明在生成一致性视图时,该事务已经提交,数据是可见的
- 当记录的trx_id>max_id时,说明在生成一致性视图时,该事务还未开始,数据是不可见
- 当记录的min_id<=trx_id<=max_id时,且trx_id在一致性视图中时,说明在生成一致性视图时,该事务已开始但是未提交,数据不可见
- 当记录的min_id<=trx_id<=max_id时,且trx_id不在一致性视图中时,说明在生成一致性视图时,该事务已提交,数据可见
MVCC过程分析
操作 | 事务A | 事务B | 事务C |
设置隔离级别并开启事务 | | | |
事务A执行查询 | 此时会生成一致性视图 [事务A] 事务A | ||
事务B修改数据并提交 | | ||
事务A再次查询 | 根据一致性视图[事务A] 事务A比对,事务B修改数据不可见,还是读取的之前数据 | ||
事务C执行查询 | 此时会生成一致性视图 [事务A,事务C] 事务C 对比一致性视图,事务B修改数据可见 | ||
事务A修改数据并提交 | | ||
事务C再次查询 | 根据一致性视图[事务A,事务C] 事务C 对比,事务A修改数据不可见 |
读事务&写事务
开启事务后,当mysql执行过select 后会真正开启读事物,并生辰一致性视图
当mysql执行过update,select ... for update,insert,delete后,会真正开启写事物