美文网首页mysql
关于Mysql中的MVCC与幻读

关于Mysql中的MVCC与幻读

作者: 蓝调_4f2b | 来源:发表于2020-11-12 20:36 被阅读0次

2020年秋招已经快结束了,在将近3个月各种大厂的轮番轰炸下,总算收获了东哥和雷总的offer并存活了下来。这篇简述我想着重记录一下秋招中遇到过很多次,每次都让我极为头痛的问题,Mysql InnoDB引擎下到底能不能有效防止幻读?
对于这个问题我最开始天真的相信了下面这张图片。

t014a29791d0aa151ad.jpg

然而每当我自信的说出可重复读不可防止幻读发生,面试官们总会留出小伙子可惜了的表情,伴随着质疑的那句你再想想?
啊。。。(我搜索尽我脑中关于Mysql的知识,说出了MVCC,但是MVCC也不能完全解决啊。。。)
。。。
就这样,我本着强烈的求知欲(求生欲)好好的研究了半天幻读的原理。

  1. 可重复读级别
    主要通过MVCC方式避免脏读与不可重复读的现象出现,介于已提交读和可串行化之间的隔离级别,为InnoDB的默认隔离级别。
    很多文章认为MySQL的锁为一种悲观锁机制,通过对于读取数据的行进行加锁,锁住数据本身而防止,从而防止其他事务修改正在读取的数据行,而于此同时如果有其他事务在数据行的间隙间插入数据的话,会造成幻读的情况。
  2. MVCC(多版本并发控制)
    然而MySQL在漫长的发展中通过乐观锁的优化慢慢的解决了这个问题。MVCC的基本原理为通过保存数据在某时刻的快照实现。一个事务无论运行多长的时间,在同一个事务中均可看到数据一致的视图。MVCC会在每行数据后添加两个额外的隐藏值(数据创建时间,数据过期时间)。通过这两个时间号对事务进行期间查找的数据进行判断。这就将原先的悲观锁机制优化为了类似CAS的乐观锁机制,通过这种方式减少锁的使用,大大提升数据的操作效率。
  3. 快照读与当期读
    通过上述锁优化机制,可重复读隔离级别下,MySQL可以通过版本号进行判断,并在有并发冲突时,将历史版本的数据呈现给用户,这种读取数据的方式在MySQL中被成为快照读。我们平时使用的select * from 一般为快照读,这种读数据的防守可以减少加锁带来的开销。而对于对数据修改的操作(insert, delete, update),我们采用当前读的方式进行。在当前读方式下,数据库会事先加入锁,锁住数据,保证数据绝对为最新。
  4. Next-Key锁
    在上述事务操作过程中,数据库会为相应的数据行添加两种锁,行锁及间隙锁。通过间隙锁防止数据行间插入新的数据,实现防止幻读的效果。
  5. 不能防止幻读的情况
    所以,当我们回归主题时,我们可不可以说可重复读级别可以防止幻读的发生?
    答案是不完全能。。。当我们考虑正常情况时,可重复读确实可以通过MVCC及Next-key机制较好的完成防止幻读的任务,然而若出现如下的情况。
specialcase.png

(1)a事务先select,b事务insert确实会加一个gap锁,但是如果b事务commit,这个gap锁就会释放(释放后a事务可以随意操作),
(2)a事务再select出来的结果在MVCC下还和第一次select一样,
(3)接着a事务不加条件地update,这个update会作用在所有行上(包括b事务新加的),
(4)a事务再次select就会出现b事务中的新行,并且这个新行已经被update修改了.

参考文章:
事务隔离级别中的可重复读能防幻读吗?
文章出处:https://www.cnblogs.com/CoderAyu/p/11525408.html

相关文章

  • 关于Mysql中的MVCC与幻读

    2020年秋招已经快结束了,在将近3个月各种大厂的轮番轰炸下,总算收获了东哥和雷总的offer并存活了下来。这篇简...

  • 66 MVCC 多版本控制模型原理与间隙锁,悲观锁。乐观锁

    1 MYSQL 事务隔离级别 四种隔离级别: 脏读,可重复读,幻读总结2,详细画图分析 MVCC 多版本并发控制与...

  • MVCC 能解决幻读吗?

    昨天面试当中一个小伙认为MVCC可以解决RR中的幻读问题, 先说结论, MVCC不能解决幻读, 但是如果本事务当中...

  • 2021-04-02 Next-Key Lock 解决幻读

    上文中已经总结了Mysql是如何利用MVCC实现四个隔离级别的,但是对于幻读问题,MVCC是无能为力的。在RR隔离...

  • mysql-mvcc

    mysql-mvcc MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读...

  • mysql的幻读处理机制

    当前与快照读 当前与快照读 mysql的幻读处理机制 参考Mysql(Innodb)如何避免幻读我在mysql 8...

  • Mysql MVCC机制

    概述 事务的ACID特性里面,Mysql通过MVCC机制来保证隔离性,实现可重复读的特性,但是可能会出现幻读的情况...

  • Mysql(六) -- 事务ACID的实现

    本文参考mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?[ht...

  • Mysql —— (转)MySQL中MVCC的正确打开方式(源码

    搬运于 MySQL中MVCC的正确打开方式(源码佐证) 序 最近在学习MySQL中的MVCC,看了网上的各种版本,...

  • MySQL 间隙锁

    间隙锁 间隙锁在MySQL中解决了幻读问题,在MySQL中通过RR也能解决幻读。 但是使用间隙锁时有两个坑需要注意...

网友评论

    本文标题:关于Mysql中的MVCC与幻读

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