b是非唯一索引
    image.png
    非唯一索引等值查询 - 图2
    会话 1 加锁变化过程如下:

    1. 先会对普通索引 b 加上 next-key lock,范围是(4,8];
    2. 然后因为是非唯一索引,且查询的记录是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是(8,16)。

    所以,会话1的普通索引 b 上共有两个锁,分别是 next-key lock (4,8] 和间隙锁 (8,16) 。
    那么,当会话 2 往间隙锁里插入 id = 9 的记录就会被锁住,而会话 3 和会话 4 是因为更改了 next-key lock 范围里的记录而被锁住的。
    然后因为 b = 16 这条记录没有加锁,所以会话 5 是可以正常执行的。