MYSQL locking docs告诉我一个声明
SELECT * FROM child WHERE id = 100;
如果id是非唯一或非索引行,将导致进行间隙锁定。但是,这是一致的非锁定select语句的语法。我认为这些语句使用了自己的快照并避免了锁定。前面的间隙锁定仅适用于查询时间吗?我哪里错了?
答案 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的例子。