mysql InnoDB存储引擎MVCC的实现策略

1.MVCC是针对 InnoDB的两种隔离级别("已提交读" read committed 和 "可重复读" read repeated),保存了某个时间点上的数据快照,这种快照开销非常少。
MVCC在隔离级别为"可重复读"的基础上,可以有效解决幻读的问题【幻读主要是由插入新数据产生的】

INnnodb结合MVCC用版本号实现的并发控制:

这里会记录两个维度的版本号,
1、行记录里保存的两个隐藏版本号:更新版本号(update version) / 删除的版本号(delete version)。
2、事务对应的版本号,在执行事务操作时也会生成一个事务号,当事务完成commit,就会把事务号更新到对应记录的两个隐藏字段中【更新记录对应的是记录的update version,删除记录对应的是记录的delete version】

注意:对应的记录的删除,是把对应的记录作版本删除标记【delete version=当前事务号】,后续MVCC会自动清除过期的delete version;
为什么不能直接把当前记录删除了,因为删除的版本号之前还有其他事物在执行,是需要这条记录的(因为用的是"可重复度"的级别)。

版本号的控制策略的举例:
比如:如果事务版本号是以时间戳生成的【微秒级】,这样就可以通过比较当前事务的版本和记录的版本号来判断记录是否可以使用。
1. insert操作,会插入一条记录并记录update version为事务的版本号
2.update操作:会做两步操作,把匹配到的数据做删除标记[delete version=当前的事务号],把匹配到的记录copy副本并标记更新版本号[update version = 当前的事务号],相当于delete+insert操作。

3.delete操作,会把当前的事务版本号更新到记录的delete version
4.select操作,查找update version<当前事务号的,且delete version>当前事务号的,如果delete version为空就不用做比较,因为为空说明该记录没被删除过。

对于以上产生的副本记录,mvcc会定时清理。

使用MVCC会带来额外的开销
1.过期版本记录的清理
2.隐藏字段的维护

你可能感兴趣的:(Mysql)