对 MySQL 与其文档相关的锁感到困惑
Confusion about MySQL locks relating to their documentation
MYSQL locking docs告诉我一个说法
SELECT * FROM child WHERE id = 100;
如果 id 是非唯一或非索引行,将导致进行间隙锁定。但是,这是一致的非锁定 select 语句的语法。我认为这些语句使用了它们自己的快照并避免了锁定。前面的间隙锁是不是只适用于查询时?我哪里错了?
您理解正确,非锁定 SELECT 不会创建任何锁,也不会创建任何间隙锁。
示例有误,或者至多不清楚。
锁定 SELECT 包括 LOCK IN SHARE MODE
(创建 S 锁)或 FOR UPDATE
(创建 X 锁)。因为有两种可能的锁定子句,也许作者打算写点什么说任何一个都会导致间隙锁,但后来他们忘了写。
在间隙锁部分的开头,文本确实使用了一个示例语句 SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;
,这更清楚地是一个锁定示例 SELECT。
MYSQL locking docs告诉我一个说法
SELECT * FROM child WHERE id = 100;
如果 id 是非唯一或非索引行,将导致进行间隙锁定。但是,这是一致的非锁定 select 语句的语法。我认为这些语句使用了它们自己的快照并避免了锁定。前面的间隙锁是不是只适用于查询时?我哪里错了?
您理解正确,非锁定 SELECT 不会创建任何锁,也不会创建任何间隙锁。
示例有误,或者至多不清楚。
锁定 SELECT 包括 LOCK IN SHARE MODE
(创建 S 锁)或 FOR UPDATE
(创建 X 锁)。因为有两种可能的锁定子句,也许作者打算写点什么说任何一个都会导致间隙锁,但后来他们忘了写。
在间隙锁部分的开头,文本确实使用了一个示例语句 SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;
,这更清楚地是一个锁定示例 SELECT。