对幻读的理解误区

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

前提条件: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
对幻读的理解误区_第1张图片
对幻读的理解误区_第2张图片

第一步:事务a执行select count(*) from t
对幻读的理解误区_第3张图片
第二步:事务b执行insert into t xxxxxxx ,对t插入1条数据
对幻读的理解误区_第4张图片

第三步:提交事务b
对幻读的理解误区_第5张图片

第四步:事务a再次执行select count(*) from t
对幻读的理解误区_第6张图片
可以看到条数没变,接下去我提交事务a后再查询看条数是多少
对幻读的理解误区_第7张图片

20200416分割线

====================================================================
在mysql技术内幕中有这样一句话对幻读的理解误区_第8张图片

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

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

你可能感兴趣的:(mysql)