-->

不可重复读和幻读是一个东西吗?

2020-09-10 13:08发布

问题:

在《mysql技术内幕:Innodb存储引擎》中有这么一句“ 在mysql官方文档中将不可重复读的问题定义为phantom problem,即幻像问题。 ”书中对不可重复读和所谓的幻读的解决办法也是一样的采用next-key locking机制,所以不可重复读和幻读是一个东西吗?

回答1:

不可重复读和幻读不是一个东西,楼上WMG-Eight已经解释了,我再详细解释一下:
不可重复读问题:这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1开启,查询表字段a=1,此时事务T2开启修改字段a=2并提交,事务T1再次查询得到结果a=2,在同一个事务中查询两次结果不同,无法重复,所以叫不可重复读。
幻读:事务T1开启查询某个表A的count=2,此时事务T2开启向A表中插入一条数据并提交,事务T1再次查询A表count=3,第二次多读出一条记录。
next-key locking:简单来说就是将自己查询过程中所见到的那些行,全部都锁住,所以以上两个问题都没了。



回答2:

不可重复读 是对同一条数据来说的,主要是修改,比如修改了某些字段值,导致多次读同一条数据不一样。
幻读 是对一个范围内的数据,主要是新增或删除,导致查询出来的数据数量不一致。
你可以搜下,有很多详细的解释的文章。。。。



回答3:

后面再细看吧,应该是底层实现锁的机制不同



回答4:

你可以查阅一些MySQL的隔离级别(读已提交、读未提交、可重复读、串行读)资料;
你上面说的不可重复读和幻读,是不同隔离级别下的现象,除此之外,还有脏读、可重复读