mysql怎么解决的幻读 mysql幻读脏读

关于MySQL的幻读问题 , 看这一篇就够了什么是幻读?
幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行 。
首先快照读是不存在幻读的,只有当前读(实时读)才存在幻读的问题 。
幻读有什么问题?
select ...for update语句就是将相应的数据行锁住 , 但是如果存在幻读,就把for update的语义破坏了 。
如何解决幻读?
产生幻读的原因是,行锁只能锁住行 , 但是新插入记录这个动作,要更新的是记录之间的“间隙” 。因此,为了解决幻读问题,InnoDB只好引入新的锁,也就是间隙锁(Gap Lock) 。间隙锁和行锁合称 next-key lock ,每个next-key lock是前开后闭区间。
总结
mysql查询的时候怎么解决脏读,幻读问题3). 幻读 :
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行 。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据 。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样 。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中 。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中 , 则可以避免该问题 。
mysql可重复读的幻读解决方案 首先需要明确的就是“幻读”概念: 隔离级别是可重复读 , 在一个事务中前后两次查询,查到了其他事务insert进来的数据 。
强调的是读取到了其他事务插入进来的数据 。
下面来论证一下可重复读下幻读的解决方案
先明确一下,for update语法就是当前读,也就是查询当前已经提交的数据,并且是带悲观锁的 。没有for update就是快照读,也就是根据readView读取的undolog中的数据 。
如果按照以上猜想 , 那么整个执行结果就违背了 可重复读 的隔离级别了 。
那么我们再假设select * from TABLE where d = 5 for update;这条语句锁定的是所有被扫描到的数据 。
这是因为T2阶段的update会被阻塞住,毕竟所有被扫描到的记录都被锁定了 。
按照上述推理过程,很显然 , 即使锁定所有扫描到的数据行,也依然存在幻读的情况 。违背了 可重复读 的隔离级别 。
针对这个情况 , 我们要解决幻读的问题,那么就要求针对所有被扫描的记录行以及还不存在的d=5的记录行都给锁住 。
至此 , 当前查询结果完全满足 可重复读 的隔离级别 。
通过以上推论,我们可以总结一下 , 在可重复读的隔离级别下,解决幻读除了需要锁定所有扫描到的记录行外,还需要锁定行之间的间隙,也就是通过间隙锁来解决幻读的问题 。
【mysql怎么解决的幻读 mysql幻读脏读】mysql怎么解决的幻读的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于mysql幻读脏读、mysql怎么解决的幻读的信息别忘了在本站进行查找喔 。

    推荐阅读