美文网首页
InnoDB的MVCC如何解决幻读

InnoDB的MVCC如何解决幻读

作者: join_a922 | 来源:发表于2018-12-03 13:36 被阅读22次

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,但是不能解决幻读问题。

    什么是幻读?

    事务A读取了一个范围内的数据,此时事务B在该范围内插入了一条数据,并立马提交了事务,此时事务A再次读取这个范围的数据时,发现多了一条,就好像幻觉一样。

    什么是MVCC?

    多版本并发控制。InnoDB为每行记录添加了一个版本号(系统版本号),每当修改数据时,版本号加一。

    在读取事务开始时,系统会给事务一个当前版本号,事务会读取版本号<=当前版本号的数据,这时就算另一个事务插入一个数据,并立马提交,新插入这条数据的版本号会比读取事务的版本号高,因此读取事务读的数据还是不会变。

    例如:

    此时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,因此读不出来,解决了幻读的问题。

    相关文章

      网友评论

          本文标题:InnoDB的MVCC如何解决幻读

          本文链接:https://www.haomeiwen.com/subject/kilycqtx.html