关于与其文档相关的MySQL锁的困惑

时间:2018-01-02 19:13:31

标签: mysql sql locks

MYSQL locking docs告诉我一个声明

SELECT * FROM child WHERE id = 100;
如果id是非唯一或非索引行,

将导致进行间隙锁定。但是,这是一致的非锁定select语句的语法。我认为这些语句使用了自己的快照并避免了锁定。前面的间隙锁定仅适用于查询时间吗?我哪里错了?

1 个答案:

答案 0 :(得分:2)

您理解正确,非锁定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的例子。