InnoDB никогда не блокирует всю таблицу для операторов DML. (Если DML не попадает во все строки.)
Существуют и другие блокировки для операторов DDL, например, когда ALTER TABLE
изменяет / добавляет столбцы / индексы / и т. Д. (Некоторые из них были значительно ускорены в MySQL 8.0.)
В комбинированном ключе с блокировкой нет ничего особенного.
Есть вещь, которая называется "блокировка промежутка". По разным причинам «разрыв» между двумя значениями в индексе будет заблокирован. Это предотвращает потенциальные конфликты, такие как вставка того же значения new , которое еще не существует, и ограничения уникальности.
Поскольку PRIMARY KEY
является уникальным ключом, вы возможно нажали что-то подобное.
Если возможно, выполните SHOW ENGINE INNODB STATUS;
, чтобы увидеть, является ли блокировка "пробелом" или нет.
Еще одна вещь, которая может произойти, это то, что блокировка может сначала стать слабой, а затем перерасти в «eXclusive». Это может привести к тупику.
Нужно ли делать выбор, чтобы восстановить значения для c и d и удалить пакеты, используя весь первичный ключ?
Я думаю, вам нужно более точно объяснить, что вы делаете. Предоставьте запрос. Обеспечить SHOW CREATE TABLE
.
Обработка блокировки InnoDB, возможно, уникальна для MySQL. У него есть некоторые причуды. Иногда он немного жаден в отношении того, что он блокирует; чтобы компенсировать это, возможно, быстрее, чем у конкурентов.
В любом случае проверьте наличие тупиков (и таймаутов) и устраните их. Надежда на то, что эти проблемы достаточно редки, чтобы иметь дело с ними, не является слишком большим бременем производительности
DELETE FROM my_table where a=? and b=?
означает, что потенциально большое количество строк удаляется. Это означает, что журнал отмены и MVCC должны выполнять большую работу. Поэтому я рекомендую стараться не удалять (или обновлять) более 1K строк одновременно.