美文网首页
InnoDB如何在RR隔离级别下避免幻读

InnoDB如何在RR隔离级别下避免幻读

作者: long_c2b7 | 来源:发表于2020-11-29 15:55 被阅读0次

InnoDB引擎,RR隔离级别下,并不能完全组织幻读的发生,想避免幻读,要保证gap锁是开启的,也就是innodb_locks_unsafe_for_binlog参数值为off(默认情况是off)

表象:快照读通过MMVC(基于事务版本控制的协议)和undo日志实现的。

在这里要区分一下快照读和当前读
快照读:就是普通的select
select * from table
当前读:加了锁的增删改查,读取的都是当前最新的数据

select * from table where ? lock in share mode;
select * from table where ? for update;
insert;
update ;
delete;

对于快照读的场景,通过mvcc版本管理来解决幻读的问题。就是a事务只做了两次查询操作,两次查询中间即使有符合条件的插入,第二次查询的结果也是原来的数据信息。但是这仅仅是表象,我们继续看内因。

内因:Next-Key(行锁和gap锁)

针对当前读的情况,mysql是通过Next-Key锁搞定的。就是在当前读的情况下,会加入一个范围锁,锁住一个区间,区间内如果有别的事务进行插入操作,是要等待当前事务提交的。
在where条件全部命中的情况下,不加gap锁
由于操作就在这个精确的范围内,再新加入数据也不会影响这些数据,那么不会发生幻读,也不触发gap锁

在table表中精确查询id为1 3 5 的数据,假如全部都能查到,不加gap锁

select * from table where id in (1,3,5)

在where条件没全部命中的情况下,触发gap锁
在table表中精确查询id为1 3 5 的数据,只能部分查到1

那么3 5会加gap锁,插入id为3和id为5的值时,要等事务1的查询结束提交才能插入

select * from table where id in (1,3,5)
gap锁的范围
若 id的值为2,6,9,11,15,那么范围为(-∞,2],(2,6],(6,9],(9,11],(11,15],(15,+∞)

相关文章

  • InnoDB如何在RR隔离级别下避免幻读

    InnoDB引擎,RR隔离级别下,并不能完全组织幻读的发生,想避免幻读,要保证gap锁是开启的,也就是innodb...

  • MySQL Gap Lock引发insert语句堵住问题排查

    一、众所周知,MySQL在RR隔离级别下,会出现幻读的问题。出现幻读的前提条件:Innodb存储引擎,在RR隔离...

  • 系统原理-MVCC

    在SQL标准中,RR是无法避免幻读问题的,但是InnoDB实现的RR避免了幻读问题。RR解决脏读、不可重复读、幻读...

  • 2020-04-29

    重温数据库知识 知识点问题 1.什么可重复读?2.什么幻读?3.为什么innodb在RR隔离级别下能解决幻读?4....

  • 探究InnoDB可重复读

    在RC(Read Committed)和RR(Repeatable Read)两种事务隔离级别下,InnoDB存在...

  • innodb中幻读与mvcc和间隙锁分析

    innodb中幻读的解决到底是依赖间隙锁还是mvcc产生了分歧。(事务隔离级别rr)面试官大大认为innodb就是...

  • InnoDB的MVCC如何解决幻读

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,但是不能解决幻读问题。 什么是幻读? 事务...

  • MySQL间隙锁、Next-Key Lock主要知识点

    总体来说,就是MySQL innoDB引擎要在RR隔离级别之下解决幻读的问题,所以引入了间隙锁。 在进行当前读的情...

  • 事务si和ssi隔离级别

    rr隔离级别:有幻读但无写偏虚 si快照隔离级别:有写偏序但无幻读,写偏序问题的规避留给应用避免,应用使用sele...

  • Mysql(六) -- 事务ACID的实现

    本文参考mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?[ht...

网友评论

      本文标题:InnoDB如何在RR隔离级别下避免幻读

      本文链接:https://www.haomeiwen.com/subject/snrniktx.html