不同隔离级别下,行级锁的种类是不同的:

  • 在读已提交隔离级别下,行级锁的种类只有记录锁,也就是仅仅把一条记录锁上
  • 在可重复读隔离级别下,行级锁的种类除了有记录锁,还有间隙锁

下面讨论 InnoDB 默认隔离级别「可重复读」

加锁的对象是索引,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成,在一些场景下会退化成记录锁或间隙锁

是什么场景呢?总结一句:在使用记录锁或间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁

唯一索引等值查询

用唯一索引进行等值查询时,查询的记录存不存在,加锁的规则也会不同:

  • 存在:在索引树上定位到这一条记录后,该记录的索引中的 next-key lock 会退化成「记录锁」
  • 不存在:在索引树找到第一条大于该查询记录的记录后,该记录的索引中的 next-key lock 会退化成「间隙锁」

存在

原因是仅靠记录锁也能避免幻读问题:

  • 由于主键具有唯一性,所以其他事务插入相同主键数据时,会因为主键冲突,导致无法插入
  • 由于加了记录锁,其他事务无法删除该记录

不存在