幻读 VS 不可重复读
幻读重点在于数据是否存在。原本不存在的数据却真实的存在了,这便是幻读。
在同一个事务中,第一次读取到结果集和第二次读取到的结果集不同。引起幻读的原因在于另一个事务进行了INSERT操作。
不可重复读重点在于数据是否被改变了。在一个事务中对同一条记录进行查询,第一次读取到的数据和第二次读取到的数据不一致,这便是可重复读。引起不可重复读的原因在于另一个事务进行了UPDATE或者是DELETE操作。
简单来说:幻读是说数据的条数发生了变化,原本不存在的数据存在了。不可重复读是说数据的内容发生了变化,原本存在的数据的内容发生了改变。
关键在于,我们需要从多事务并发的角度来考虑问题:
理解
从理解上,区分不可重复读与幻读,需要特别注意不同的隔离级别:
READ UNCOMMITTED :读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结 果。不能避免脏读、不可重复读、幻读。
READ COMMITTED :读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做 的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可重复读、幻读问题仍然存在。
比如A事务正在crud,B事务在这个过程中update或者insert了数据并完成了提交,那么A事务在B提交前后两个时间点查到的数据是不一致的。REPEATABLE READ :可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据(很关键),读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。
解释:幻读问题仍然存在。
是因为别的事务update要读取的数据,将不会被本次事务看到,由于MVCC版本控制,能一直回溯到数据记录当初的版本,避免不可重复读。
但别的B事物添加进来几条数据,还是可以读到的(但本次A事务明明没添加这些数据!所以幻读了)文章来源:https://www.toymoban.com/news/detail-466446.htmlSERIALIZABLE :可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避免:脏读、不可重复读和幻读。
文章来源地址https://www.toymoban.com/news/detail-466446.html
到了这里,关于幻读与不可重复读的区分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!