MVCC
# MVCC多版本并发控制机制
- 在读已提交和可重复读隔离级别下都实现了MVCC机制
- 对一行数据的读和写两个操作不通过加锁互斥来保证隔离性,避免了加锁互斥
读-写即一个事务进行读取操作,另一个进行写入操作。这种情况下可能会产生脏读、不可重复读、幻读。最好的方案是读操作利用多版本并发控制(MVCC),写操作进行加锁。- 总结: MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取 同一条数据在版本链上的不同版本数据。
# 实现/机制
# undo日志版本链
- 定义:: 记录某个数据历次被修改的版本,并通过回滚指针连接起来,当发生数据回滚时可以通过undo版本链恢复到以前的数据。
- 据被多个事务依次修改过后,在每个事务修改完后,undo回滚日志会保留修改前的数据,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链
- 版本链状态 : 已提交的事务、未提交和已提交的事务、未开始的事务
# read view
一致性视图,快照,也就是这个查询的数据副本。
# 两部分组成
- 所有未提交事务id数组
- 已提交的最大事务id
# 生成时机
- 在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化
- 如果是读已提交隔离级别在每次执行查询sql时都会重新生成
- 由以上两点区别,导致不同的隔离级别查询结果不一致!
# undo版本链和read-view的对比规则
undo版本链从上往下的循环,取事务id,和read-view进行对比
# 参考资料
编辑 (opens new window)
上次更新: 2023/01/24, 15:21:15