首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么innodb使用gap锁作为唯一的索引,具有唯一的搜索条件?

为什么innodb使用gap锁作为唯一的索引,具有唯一的搜索条件?
EN

Stack Overflow用户
提问于 2022-07-23 10:08:12
回答 1查看 143关注 0票数 0

我有下表

代码语言:javascript
复制
CREATE TABLE `bar` (
  `id` int(11) NOT NULL,
  `age` int(11) NOT NULL,
  `value` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

和以下数据

代码语言:javascript
复制
id|age|value|
--+---+-----+
 1|  1|    1|
 5|  5|    5|
 9|  9|    9|

在连接一中,运行

代码语言:javascript
复制
start transaction;
update bar set value = 0 where id = 8;

在第二个连接中,运行

代码语言:javascript
复制
start transaction;
insert into bar(id,age,value) values(7,7,7);

现在insert语句被间隙锁阻塞。

代码语言:javascript
复制
lock_id    |lock_trx_id|lock_mode|lock_type|lock_table |lock_index|lock_space|lock_page|lock_rec|lock_data|
-----------+-----------+---------+---------+-----------+----------+----------+---------+--------+---------+
5218:85:3:4|5218       |X,GAP    |RECORD   |`bar`.`bar`|PRIMARY   |        85|        3|       4|9        |
5217:85:3:4|5217       |X,GAP    |RECORD   |`bar`.`bar`|PRIMARY   |        85|        3|       4|9        |

然而,根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html的说法,

更新..。在哪里..。为搜索遇到的每一条记录设置一个独占的下键锁。但是,对于使用唯一索引来搜索唯一行的语句,只需要索引记录锁。

索引记录锁定是否仅在发现和锁定任何记录时使用?否则,还需要下一个钥匙锁吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-23 14:09:14

一个猜测..。您的两个查询都有相同的差距。InnoDB并不是为了意识到"8“和"7”不会冲突;相反,它只是简单地锁定了整个差距。

我认为间隙锁定涵盖了许多深奥的边缘情况--并且以一种简单的方式进行。这有助于提高效率,但代价是有时锁定“太多”。

这些文档可能是20年前编写的(当InnoDB发布时),没有人注意到这个错误。我建议您在bugs.mysql.com上提交一个文档错误。那些比我了解得更多的人(希望)要么解释得更好,要么修复这个文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73089810

复制
相关文章

相似问题

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