Блокирует ли InnoDB всю таблицу для удаления, в котором используется часть составного ключа? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть таблица MySQL (назовите ее «my_table») с составным первичным ключом с 4 столбцами (назовите их «a», «b», «c» и «d»).

Вхотя бы один раз я сталкивался с тупиковой ситуацией при параллельных асинхронных вызовах EJB, вызывающих ' DELETE FROM my_table where a =?и b =? 'с разными значениями, поэтому я начал изучать, как работает блокировка таблиц InnoDB.

Я не нашел четкой документации о том, как блокировка таблиц работает с составными ключами.Вся таблица заблокирована удалением, несмотря на то, что нет фактического перекрытия между фактическими удаляемыми строками?

Нужно ли делать выбор, чтобы восстановить значения для c и d и удалить пакеты, используя целоеосновной ключ?

Это в контексте сложного приложения, которое работает с 4 различными базами данных.Кажется, только MySQL имеет эту проблему.

1 Ответ

0 голосов
/ 27 октября 2018

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 строк одновременно.

...