「MySQL基础」不可重复读和幻读的区别

「MySQL基础」不可重复读和幻读的区别

文章参考:

在数据库中不可重复读和幻读到底应该怎么分?

作者:暖猫Suki普通熊猫


一、概述

正好在琢磨这个问题,也被搞得头昏脑涨,不对之处请牛人指正。

脏读、不可重复读、幻读,网上介绍这几个概念的博文很多。天下博文一大抄,都没有说清楚不可重复读和幻读的区别,只有一篇文章略微提到了一点,这里结合我的理解说一下。

其实这三种现象都是并发读写导致的。

  • 脏读”指读到了未提交的数据,然后基于这个数据做了一些事情,结果做完发现数据被回滚了。可以理解为领导还没下达正式任务你就凭着自己的揣摩开始干活,结果活干完了,任务的内容被改了。
  • 不可重复读”好一点,读到的是已提交的数据,比如某个读事务持续时间比较长,期间多次读取某个元组,每次读到的都是被别人改过并已提交的不同数据。可以理解为在执行任务的过程中,领导的指令一直在变。。但好歹是正式下达的指令。
  • 幻读”是指读的过程中,某些元组被增加或删除,这样进行一些集合操作,比如算总数,平均值等等,就会每次算出不一样的数。所以“不可重复读”和“幻读”都是读的过程中数据前后不一致,只是前者侧重于修改,后者侧重于增删。

个人认为,严格来讲“幻读”可以被称为“不可重复读”的一种特殊情况,没错的。但是从数据库管理的角度来看二者是有区别的。解决“不可重复读”只要加行级锁就可以了。而解决“幻读”则需要加表级锁,或者采用其他更复杂的技术,总之代价要大许多。这是搞数据库的那帮家伙非要把这两者区分开的动机吧。

禁止写时读,避免了“脏读”,对应隔离级别read committed

禁止读时写,避免了“不可重复读”,对应隔离级别repeatable read

而为了避免“幻读”,干脆把整个表给锁住了,只能是serialize了。

隔离级别越高,并行度越低,付出的代价越大。

顺便说一下,phantom这个词是幻影,幽灵的意思,跟“幻读”的现象没有直接关系。很多文章说遇到“幻读”就像出现幻觉一样,个人以为十分牵强。“幻读”就是软件工程中一个很普通的问题,是人类思虑不周全的结果。老外工程师通过禁止读的时候修改解决了“不可重复读”的问题,本以为万事大吉了,谁知又出现了增加导致的不一致,不由感慨:我X真是个phantom。用中国话说,就是真TM见鬼了。国内翻译成了“幻读”,搞得很神秘,逼格很高的样子。


二、小结

  • 不可重复读是读异常,但幻读则是写异常。

  • 不可重复读是读异常的意思是,如果你不多select几次,你是发现不了你曾经select过的数据行已经被其他人update过了。避免不可重复读主要靠一致性快照

  • 幻读是写异常的意思是,如果不自己insert一下,你是发现不了其他人已经偷偷insert过相同的数据了。解决幻读主要靠间隙锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FrozenPenguin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值