【发布时间】:2018-01-02 19:13:30
【问题描述】:
MYSQL locking docs告诉我一个声明
SELECT * FROM child WHERE id = 100;
如果 id 是非唯一或非索引行,将导致进行间隙锁定。但是,这是一致的非锁定选择语句的语法。我认为这些语句使用了自己的快照并避免了锁定。前面的间隙锁是否只适用于查询时?我哪里错了?
【问题讨论】:
MYSQL locking docs告诉我一个声明
SELECT * FROM child WHERE id = 100;
如果 id 是非唯一或非索引行,将导致进行间隙锁定。但是,这是一致的非锁定选择语句的语法。我认为这些语句使用了自己的快照并避免了锁定。前面的间隙锁是否只适用于查询时?我哪里错了?
【问题讨论】:
您理解正确,非锁定 SELECT 不会创建锁,也不会创建任何间隙锁。
这个例子是错误的,或者充其量是不清楚的。
锁定 SELECT 包括 LOCK IN SHARE MODE(用于创建 S 锁)或 FOR UPDATE(用于创建 X 锁)。因为有两种可能的锁定子句,也许作者打算写一些东西说任何一个都会导致间隙锁,但后来他们忘记了。
在 Gap Locks 部分的开头,文本确实使用了示例语句 SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;,这更清楚地是锁定 SELECT 的示例。
【讨论】: