При выполнении операций DML
InnoDB
устанавливает блокировки на строки и пробелы в индексах.
Проблема в том, что он блокирует все проверенные строки , а не только те, затронутые .
Скажите, если вы выполните этот запрос:
UPDATE mytable
SET value = 10
WHERE col1 = 1
AND col2 = 2
, блокировка будет зависеть от индексов, используемых для запроса:
Если использовался индекс на col1, col2
, блокируются только затронутые строки
Если использовался индекс для col
, все строки с col1 = 1
будут заблокированы
Если использовался индекс для col2
, все строки с col2 = 2
будут заблокированы
Если индекс не использовался, все строки и пропуски индекса будут заблокированы (в том числе в PRIMARY KEY
, так что даже от INSERT
до AUTO_INCREMENT
столбца будет заблокировано)
Что еще хуже, EXPLAIN
в MySQL
не работает с DML
операциями, поэтому вам придется угадывать, какой индекс использовался, так как оптимизатор может выбрать любой, если сочтет его лучшим.
Возможно, ваши инструменты репликации и обновления одновременно блокируют записи (и, как вы можете видеть, это может произойти, даже если условия WHERE
не перекрываются).