【问题标题】:What's the difference between Next-Key Locks And Gap Lock?Next-Key Locks 和 Gap Lock 有什么区别?
【发布时间】:2018-12-26 09:04:29
【问题描述】:

最近我阅读了 MySQL5.7 文档中的 InnoDB Locks,https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks。 我对 Next-Key Lock 和 Gap Lock 感到困惑。 在文档中,Next-Key Lock 锁定了记录和它之前的间隙,而 Gap Lock 锁定了唯一的间隙? 例如:

CREATE TABLE `r` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`k` int(11) DEFAULT NULL,
`u` int(11) DEFAULT NULL,
`v` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_u` (`u`),
KEY `idx_k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
insert into r values (2,2,2,2),(6,6,6,6),(7,7,7,7);

声明 1: select * from r where u = 4 for update;

语句1使用唯一索引搜索不存在的记录,它使用间隙锁,锁定区域u B+tree从(u=2, id=2)到(u=6, id=6)防止从插入,但不锁定记录k B+tree (u=2, id=2) and (u=6, id=6)。

声明 2: select * from r where k = 6 for update;

语句2使用非唯一索引搜索存在的记录,它使用next-key lock锁定区域k B+tree from ((k=2, id=2), (k=6, id=6 )] 并且间隙锁从 ((k=6, id=6), (k=7, id=7)) 锁定区域 k B+tree,同时锁定 id = 6 的簇索引;

所以我的问题是:
1、锁定区域((k=2, id=2), (k=6, id=6)]是next-key lock, 区域((k=6, id=6), (k= 7, id=7)) 是间隙锁,对吗?
2,这两种说法的理解对吗?

请原谅我的英语。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我认为你所有的陈述都是正确的。

    检查答案的另一种方法是检查 data_locks 表中的 innodb 执行的锁。

    select * from performance_schema.data_locks;
    

    您可以检查 LockMode 列:

    • X/S :表示下一键锁定;
    • X/S, Gap :combo 表示间隙锁定结束;

    • X/S, Rec_not_gap :组合表示记录锁定。

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 2016-10-07
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2020-08-26
      • 2012-11-20
      • 2012-04-18
      相关资源
      最近更新 更多