多版本并发控制MVCC
MVCC是用来干什么的?
在Mysql的Innodb存储引擎中,多版本并发控制MVCC是为了解决在可重复读(Repeatable Read)隔离级别下的幻读问题而出现的。
MVCC的具体实现
MVCC有乐观和悲观两种实现方式,下面我以Innodb中的版本为例讲述他的具体实现
首先,MVCC会在每张表后添加隐藏的两列,分别用来记录 修改时的系统版本号
以及 删除时的系统版本号
(系统版本号与事务有关,每开启一个新事务,系统版本号都会递增,当前事务的版本号取当前的系统版本号),在增删改查时,通过对这两列隐藏版本号的修改来解决幻读等问题,下面我们来具体看一下:
SELECT
- 在select操作中会分别根据这两行采取不同的过滤条件:
- 对于修改版本号列,修改版本号小于等于当前事务的版本号,即当前事务开启前的修改才会去读取或者时当前事务的修改
- 对于删除版本号列,删除版本号大于当前事务的版本号或者删除版本号未定义,即在我开启事务之后删除的数据我依然可以读取
- 在select操作中会分别根据这两行采取不同的过滤条件:
INSERT
- 插入的每一行都会把修改版本号字段设置为当前版本号。
DELETE
- 删除的每一行并不是真正的删除,只是将删除版本号设置为删除时的系统版本号。
UPDATE
- 更新操作为新插入一行,并把原来的行的删除版本号设置为当前系统版本号,而新插入的修改版本号设置为当前系统版本号。
emsp;通过这样的设置,使得Innodb不需要串行化就可以在可重复读的隔离条件下解决幻读问题,提高了增删改查的效率