原创

MVCC多版本并发控制

温馨提示:
本文最后更新于 2022年11月29日,已超过 891 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

MVCC全称是:Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事物内读取到的内存做处理,用来避免写操作堵塞读的并发问题。

主要是为了避免线程A在改写数据库操作过程中,B线程读取时出现幻读问题。

MVCC有两种实现方式:

第一种实现方式(忽略):将数据记录的多个版本保存到数据库中,当这些不同版本数据不再需要时,垃圾收集器回收这些记录。

第二种实现方式:只在数据库保存最新版本的数据,但是会在使用undo时动态重构旧版本数据,这种方式被oracle 和 mysql/innodb使用。

实现机制:

MVCC可以认为是行级锁的一个变种,它可以在很多情况下避免加锁的操作,因此开销更低。

MVCC的实现大都都实现了非阻塞度的操作,锁的操作也只是锁定必要的行,Innodb 的MVCC实现是通过保存数据在某个时间点的快照来实现的。一个事物不管执行多长时间,其内部看到的数据是一致的。

InnoDB的MVCC通过在每行记录后面添加两个隐藏的列来实现:一个保存了行的创建时间,一个保存了行的过期时间,当然这里的时间并不是时间戳而是版本号,没开启一个新的事物系统版本号就会递增,

在RR隔离级别下,MVCC的操作如下:

1. select操作:Innodb只查找版本号早于(包含等于)当前事物版本的数据行,可以确保事物读取的行要么是事物开始前就已经存在,或者自身插入或者修改的数据。

行的删除版本要么未定义,要么大于当前事物版本号,可以确保事物读取的行,在事物开始前未删除。

2. insert操作:将新插入的行保存当前版本号为行版本号

3. delete操作:将删除的行保存为当前版本号为删除标记

4. update操作:变为insert 和 delete操作的组合,insert的行保存为当前版本号为行版本。delete操作则保存当前版本号到原来的行为作为删除标记。

由于旧数据并不一定真的删除,必须对这些数据进行清理,innodb会开启一个后台线程去执行清理工作,具体的规则是将删除版本号小于当前系统版本的行删除,这个过程叫做purge。 

正文到此结束