在MySQL文档14.6.1 InnoDB Locking "Gap Locks"部分中,这样说
使用唯一键锁定行的语句不需要间隙锁定 索引以搜索唯一行。 ...例如,如果
的行id
列具有唯一索引,以下语句仅使用 索引记录锁定,用于ID值为100和...
SELECT * FROM child WHERE id = 100;
如果
id
未编入索引或具有 非唯一索引,语句确实锁定了前面的间隙。
但是,在后续部分14.6.3 Locks Set by Different SQL Statements in InnoDB中,
SELECT ... FROM是一致的读取,读取数据库快照并不设置锁,除非将事务隔离级别设置为SERIALIZABLE。
似乎后者(无锁)与前者(需要记录或间隙锁)发生冲突。
我误解了吗?
答案 0 :(得分:0)
不。这里没有矛盾。后面的语句指出SELECT ... FROM
不会锁定任何内容,因为这是没有SELECT
子句的WHERE
。
此外,在前一种情况下,您所谈论的是一个非常特定的锁定,该锁定仅防止插入具有特定键值的记录(“间隙锁定”)。