对幻读的理解误区

先来个例子,如果你的答案跟实验答案一样,相比你已经不需要看这篇文章了。

前提条件:rr隔离级别下,有事务a,b两个事务,表t(里面有数据)
现在开启事务a和b(不论先后)。
第一步:事务a执行select count() from t 得到结果1
第二步:事务b执行insert into t xxxxxxx ,对t插入1条数据
第三步:事务b提交
第四步:事务a再次执行select count(
) from t 。问得到的结果是多少?
有一些博客说结果是2,这就是幻读。
真实答案:结果还是1条。
原因:因为隔离级别是可重复读。即为当同一个事务a中2次读取同样数据之间有其他事务b修改了该数据并提交,那么b修改的数据对a来说是不可见的,即事务a第二次读取到的数据跟第一次读取到的是一样的。
所以网上写的幻读指的是事务b提交后事务c来读取发现结果是2,以为自己出现了幻觉。而不是在未提交的事务b中再次进行查询。

接下来是验证过程:
先是开启事务a和事务b
开启事务a
开启事务b

第一步:事务a执行select count(*) from t
在这里插入图片描述
第二步:事务b执行insert into t xxxxxxx ,对t插入1条数据
在这里插入图片描述

第三步:提交事务b
在这里插入图片描述

第四步:事务a再次执行select count(*) from t
在这里插入图片描述
可以看到条数没变,接下去我提交事务a后再查询看条数是多少
在这里插入图片描述

20200416分割线

====================================================================
在mysql技术内幕中有这样一句话在这里插入图片描述

该书表示只有脏读,不可重复读,和丢失更新这三种现象,将幻读和不可重复读视为同一种现象。对于丢失更新的解释如下:在这里插入图片描述
个人觉得各种博客中定义的幻读更像是对这一现象的描述。所以幻读出自何处,如何理解有待继续考究。

=====================================================================
本文章仅代表个人理解!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值