MVCC多版本并发控制机制的实现

MVCC(Multiversion concurrency control )是一种多版本并发控制机制,解决了幻读的问题。

不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。

InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间)。并且存储的并不是真实的时间值,而是系统版本号(system version number)。MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容。

SELECT:

  1. 查找版本早于当前事务版本的数据行。
  2. 行的删除版本要么未定义,要么大于当前事务的版本号。

INSERT:
为新插入的一行保存当前系统版本号作为行版本号。

DELETE:
为删除的每一行保存当前系统版本号作为删除标识。

UPDATE:
UPDATE为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识。MVCC的意思用简单的话讲就是对数据库的任何修改的提交都不会直接覆盖之前的数据,而是产生一个新的版本与老版本共存,使得读取时可以完全不加锁。这样读某一个数据时,事务可以根据隔离级别选择要读取哪个版本的数据。过程中完全不需要加锁。


MVCC 解决幻读的问题:
在读取事务开始时,系统会给事务一个当前版本号,事务会读取版本号<=当前版本号的数据。
此时books表中有5条数据,版本号为1

事务A,系统版本号2:select * from books;因为1<=2所以此时会读取5条数据。

事务B,系统版本号3:insert into books ...,插入一条数据,新插入的数据版本号为3,而其他的数据的版本号仍然是2,插入完成之后commit,事务结束。

事务A,系统版本号2:再次select * from books;只能读取<=2的数据,事务B新插入的那条数据版本号为3,因此读不出来,解决了幻读的问题。

你可能感兴趣的:(MVCC多版本并发控制机制的实现)