MySQL锁定和使用唯一索引锁定行的语句

时间:2018-10-31 08:15:35

标签: mysql database innodb

在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。

似乎后者(无锁)与前者(需要记录或间隙锁)发生冲突。

我误解了吗?

1 个答案:

答案 0 :(得分:0)

不。这里没有矛盾。后面的语句指出SELECT ... FROM不会锁定任何内容,因为这是没有SELECT子句的WHERE。 此外,在前一种情况下,您所谈论的是一个非常特定的锁定,该锁定仅防止插入具有特定键值的记录(“间隙锁定”)。