我有下表
CREATE TABLE `bar` (
`id` int(11) NOT NULL,
`age` int(11) NOT NULL,
`value` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB和以下数据
id|age|value|
--+---+-----+
1| 1| 1|
5| 5| 5|
9| 9| 9|在连接一中,运行
start transaction;
update bar set value = 0 where id = 8;在第二个连接中,运行
start transaction;
insert into bar(id,age,value) values(7,7,7);现在insert语句被间隙锁阻塞。
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的说法,
更新..。在哪里..。为搜索遇到的每一条记录设置一个独占的下键锁。但是,对于使用唯一索引来搜索唯一行的语句,只需要索引记录锁。
索引记录锁定是否仅在发现和锁定任何记录时使用?否则,还需要下一个钥匙锁吗?
发布于 2022-07-23 14:09:14
一个猜测..。您的两个查询都有相同的差距。InnoDB并不是为了意识到"8“和"7”不会冲突;相反,它只是简单地锁定了整个差距。
我认为间隙锁定涵盖了许多深奥的边缘情况--并且以一种简单的方式进行。这有助于提高效率,但代价是有时锁定“太多”。
这些文档可能是20年前编写的(当InnoDB发布时),没有人注意到这个错误。我建议您在bugs.mysql.com上提交一个文档错误。那些比我了解得更多的人(希望)要么解释得更好,要么修复这个文档。
https://stackoverflow.com/questions/73089810
复制相似问题