幻读是个什么东东,可以吃么(滑稽)

最近闲来没事,于是又掏出那本《高性能MySQL》再温习一次
看到事务的四个隔离等级那里,突然想起当时第一次看的时候的一个小问题:脏读和幻读有啥差别,或者换句话说,幻读是个啥东东
第一次看的时候产生过这个疑问,在了解之后又一次闲聊朋友恰好也问过我这个问题,于是我当时把这个问题标记在了书上,待第二次再读时加深一下印象。今天刚好翻到,于是决定写篇博客分享一下。

首先,脏读和幻读都是什么东东?

脏读(Dirty Read)是指在一个事务中读到了另一个事务还未提交的操作。
举个例子:比如事务A开启事务,然后事务B开启事务,在事务A中做了一个插入操作,然后不提交去事务B中查找,发现居然查到了事务A插入的数据,这个算做脏读。
脏读发生在读未提交(Read Uncommitted)这个事务隔离等级中,在读已提交(Read Committed)以后的隔离等级中都不会出现。

幻读(Phantom Read),《高性能MySQL》中给出的定义是:指一个事务在读取某个范围的记录时,另一个事务向这个范围内插入了新的记录,之前的事务再次读取该范围的记录时会产生幻行(Phantom Row)。
我个人的解释其实就是可重复读(Repeatable Read)的特性导致的,理解了可重复读的本质就知道啥是幻读了。
首先可重复读这个隔离等级是为了解决读已提交隔离等级中的不可重复读问题(即在一个事务中多次查询数据期间,另一个事务提交了更改操作,导致多次查询的结果出现不一致,也就是结果不可重复读)而诞生的。可重复读保证了单次事务中对某范围内的数据查询时结果自始至终都一样,那么也就说明在事务未提交的期间我们这个事务读不到其他事务插入的记录,但是其他事务提交的插入记录已经生效了,表中确确实实在这个范围内多了一条记录,我们读的时候顶多也就是读不到,但我们要插入id相同的一行数据是不是就插不进去了,这也就是所谓的幻行,即记录已经存在,但读不到它,这个位置还插不进去。这就是幻读了,幻读并不是读到了,幻读的概念是翻译过来的,它本身的名字phantom read中的phantom有幽灵,幻影的意思,试想一下,没人真的看见过幽灵吧。幻读就是没读到但是那里有东西存在的意思。

幻读和脏读的区别,我个人理解的话,脏读真的确确实实读到了数据,幻读本质上根本没读到数据,只是插入的时候那个位置插不进去而已。

就像下面两张图这样,图一先开一个事务,然后图二开另一个事务,先各自读一次,一定读出来的结果是相同的。然后图一插入一条记录,然后提交。这个时候图二中的事务再读一下表中全部的记录,发现读不到刚刚提交的那条新增的记录(保持可重复读的特性),但刚刚图一插入操作已经提交了,数据库中真真切切的有这条记录存在。这时我们图二的事务尝试在图一插入的数据那一行插入数据,这个时候就会报错,说这个位置key重复了,证明这个位置有数据,但我们读还读不到,这就是幻读啦。
在这里插入图片描述
在这里插入图片描述

以上是我个人对幻读的一些小小的理解,如有不正确的地方欢迎路过的大佬们批评指正,谢谢大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值