【问题标题】:Why Next-Key lock is called this way?为什么 Next-Key 锁要这样称呼?
【发布时间】:2019-06-30 22:13:14
【问题描述】:

据我了解(基于official docs),Next-Key 锁是索引记录锁 + 索引记录之前的间隙锁(前间隙)。

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

【问题讨论】:

    标签: mysql locking innodb


    【解决方案1】:

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

    通过索引搜索或扫描获取下一个键锁。

    UPDATE mytable WHERE id > 18;
    

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

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

    INSERT INTO mytable (id) VALUES (19);
    

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

    这样想:您无法锁定 19,因为其他会话已经锁定了包含您要插入的值 19 以及 20 的间隙,即 下一个索引中真正存在的 19 之后的键

    【讨论】:

    • 如果会话尝试插入 21 怎么办?
    • 21 大于 18,因此与 UPDATE 创建的间隙锁冲突。
    • 所以我的理解是,(如果我错了请纠正我),创建了两个间隙锁,13-20和20-infinity?对?在这种情况下不会创建索引记录,因为 18 不是键。
    • 没错。 18 之后的任何间隙都被锁定,因为 UPDATE 将大于 18 的整个范围锁定到无穷大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2012-01-05
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多