为什么 Next-Key 锁被称为这种方式?

GPr*_*ost 6 mysql innodb locking

据我了解(基于官方文档),Next-Key 锁是索引记录锁 + 索引记录之前的间隙锁(前导间隙)。

所以我很好奇为什么叫NEXT-Key锁?这里的“关键”是什么意思,为什么是“下一步”?

Bil*_*win 10

在这种情况下,表示索引中的一个条目。所以可以说,“一个键被锁定”,这意味着某个会话对索引中的一个条目持有锁。

通过索引搜索或扫描获取 next-key 锁。

UPDATE mytable WHERE id > 18;
Run Code Online (Sandbox Code Playgroud)

假设索引 10、11、13 和 20 中实际上有值(如该手册中的示例)。上面显示的 UPDATE 将锁定 20 的条目,以及 20 之前的间隙,因为它是索引扫描。

然后您的会话尝试插入间隙:

INSERT INTO mytable (id) VALUES (19);
Run Code Online (Sandbox Code Playgroud)

这与 next-key lock 的 gap-lock 部分冲突。

可以这样想:你不能在 19 上获得锁,因为其他一些会话已经锁定了包含你想要插入的值 19 以及 20 的间隙,这是19 之后真正存在的下一个键在索引中。

  • 如果会话尝试插入 21 怎么办? (2认同)
  • 21 大于 18,因此它与 UPDATE 创建的间隙锁冲突。 (2认同)
  • 所以我的理解是,(如果我错了,请纠正我),创建了两个间隙锁,13-20和20-无穷大?正确的?在这种情况下不会创建任何索引记录,因为 18 不是键。 (2认同)
  • 这是正确的。18 之后的任何间隙都会被锁定,因为 UPDATE 会锁定大于 18 直至无穷大的整个范围。 (2认同)