В транзакции MySQL в InnoDB блокировка разрыва создается для запроса SELECT ... FOR UPDATE
в режиме REPEATABLE READ
.
Таким образом, если транзакция T1 выполняет запрос SELECT * FROM `inventory` WHERE `price`=45545 FOR UPDATE;
, а затем T2 выполняет UPDATE `inventory` SET `color`=3 WHERE `price`=45545;
, T2 останавливается, пока T1 не завершится из-за блокировки промежутка. Это поведение полезно, поскольку T1 поддерживает инвариант, что он имеет эксклюзивную блокировку для всех строк, имеющих `price`=45545
.
Однако, похоже, это не тот случай, когда нет строк, начинающихся с `price`=45545
. В этом случае блокировка пробела не создается, и T2 работает успешно, нарушая инвариант.
Есть ли способ заставить MySQL захватить пробел, даже если ни одна строка не совпадает?