Next-Key锁和Gap锁有什么区别?

时间:2018-12-26 09:04:30

标签: mysql

最近,我在MySQL5.7文档https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks中阅读了InnoDB 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)和(u = 6,id = 6)。

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

语句2使用非唯一索引搜索已存在的记录,它使用next键锁定从((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)]是下一键锁定,而区域((k = 6,id = 6),(k = 7,id = 7))是一个间隙锁,对吗?
2,对这两个陈述的理解正确吗?

请原谅我的英语。

1 个答案:

答案 0 :(得分:1)

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

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

select * from performance_schema.data_locks;

您可以检查LockMode列:

  • X / S:表示下一键锁定;
  • X / S,间隙:组合表示间隙锁定端;

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