В разделе документа MySQL 14.6.1 InnoDB Блокировка «замков разрыва» сказано
Gap locking is not needed for statements that lock rows using a unique index to search for a unique row. ... For example, if the
id
column has a unique index, the following statement uses only an index-record lock for the row having id value 100 and ...
SELECT * FROM child WHERE id = 100;
If
id
is not indexed or has a nonunique index, the statement does lock the preceding gap.
Однако в последующей части, 14.6.3 Блокировки, устанавливаемые различными операторами SQL в InnoDB, говорится
SELECT ... FROM is a consistent read, reading a snapshot of the database and setting no locks unless the transaction isolation level is set to SERIALIZABLE.
Кажется, что последний (без блокировок) конфликтует с первым (нужна блокировка записи или пробела).
Я что-то неправильно понял?
Нет. Здесь нет противоречия. В последнем заявлении говорится, что SELECT ... FROM
ничего не блокирует, потому что это SELECT
без пункта WHERE
.
Более того, в первом случае вы говорите об очень специфической блокировке, которая предотвращает только ВСТАВКУ записей с определенными ключевыми значениями («блокировка пробела»).