Если вы установите уровень изоляции транзакции на SERIALIZABLE
, InnoDB
, то будет добавлено LOCK IN SHARE MODE
ко всем SELECT
операторам.
Этот режим конфликтует с блокировками, установленными SELECT FOR UPDATE
, и SELECT
s блокируется.
Обратите внимание, что InnoDB
может заблокировать больше строк, чем удовлетворяет условию WHERE
. Это потому, что он блокирует все строки отсканированные , а не только те строки, которые соответствовали .
Скажем, у вас есть индекс на col1
и этот запрос:
SELECT *
FROM mytable
WHERE col1 = 1
AND col2 = 2
FOR UPDATE
использует этот индекс.
Это заблокирует все записи с col1 = 1
, даже те, с col2 <> 2