MVCC 实现

为什么要使用MVCC技术?

数据库在不同的隔离级别下需要解决

不可重复读 和 幻读 的问题。其实通过锁的方式就可以解决,但是锁的问题是性能太差。MVCC解决了这个问题,同时实现了高性能。

MVCC在Mysql中的实现:

  • SELECT时,读取创建版本号<=当前事务版本号,删除版本号为空或>当前事务版本号。
  • INSERT时,保存当前事务版本号为行的创建版本号
  • DELETE时,保存当前事务版本号为行的删除版本号
  • UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行
  • MVCC解决了幻读问题了吗?

    答案是没有。mvcc只是解决了一部分幻读的问题,也就是幻读中的读问题(因为是快照读)。

    MySQL在RR级别下是通过gap lock解决了当前读情况下的幻读问题。

    事务的隔离级别只涉及到了读的问题。并没有涉及到写的问题。


    分享到:


    相關文章: