MySQL:逃不掉的锁事,间隙锁( 五 )


3.8 一个死锁的例子

MySQL:逃不掉的锁事,间隙锁

文章插图
  • sessionA启动事务后执行查询语句加lock in share mode,在索引c加next-key lock(5,10]和间隙锁(10,15);
  • sessionB的update语句也要在索引c上加next-key lock(5,10],进入锁等待;
  • 然后sessionA要再插入(8,8,8)这一行,被sessionB的间隙锁锁住 。由于出现了死锁,InnoDB让sessionB回滚;
session B 的“加 next-key lock(5,10] ”操作 , 实际上分成了两步,先是加 (5,10) 的间隙锁 , 加锁成功;然后加 c=10 的行锁,这时候才被锁住的 。也就是说,我们在分析加锁规则的时候可以用 next-key lock 来分析 。但是要知道,具体执行的时候,是要分成间隙锁和行锁两段来执行的 。
就算分成了两步 , 为什么session B加(5,10)就能成功呢?session A不是加了(5, 10]的锁吗? 前面应该也是提到过的,间隙锁和间隙锁之间并不冲突,间隙锁和insert到这个间隙的语句才会冲突,因此session B加间隙锁(5, 10)是可以成功的 , 但是如果往(5, 10)里面插入的话会被阻塞 。但是如果直接加next-key lock(5, 10],那么肯定是会被阻塞的,因此这个例子确实说明,加锁的步骤是分两步的,先是间隙锁 , 后是行锁 。而且只要理解了间隙锁和行锁之间冲突的原则是不一样的,也就很容易理解这两个锁并不是一起加的了 。 




推荐阅读