首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Next-Key Lock和Gap Lock有什么区别?

Next-Key Lock和Gap Lock有什么区别?
EN

Stack Overflow用户
提问于 2018-12-26 17:04:30
回答 1查看 612关注 0票数 6

最近我在MySQL5.7文档https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks中读到了InnoDB锁。我搞混了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 from (u=2,id=2) to (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使用非唯一索引查找已存在的记录,它使用下一个键锁锁定区域k B+tree from ((k=2,id=2),(k=6,id=6)]和间隙锁锁定区域k B+tree from ((k=6,id=6),(k=7,id=7)),也锁定id =6的簇索引;

所以我的问题是:

1、锁区域((k=2,id=2),(k=6,id=6)]是下一键锁,区域((k=6,id=6),(k=7,id=7))是间隙锁,对吗?

2、对这两种说法的理解正确吗?

请原谅我的英语。

EN

回答 1

Stack Overflow用户

发布于 2020-02-12 22:22:27

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

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

代码语言:javascript
复制
select * from performance_schema.data_locks;

您可以检查LockMode列:

  • X/S :表示下一键锁;
  • X/S,Gap :组合表示间隙锁结束;
  • X/S,Rec_not_gap :组合表示记录锁。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53929780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档