LOCK TABLES может вызвать взаимные блокировки в InnoDB?

Из руководства MySQL ( https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks.html ):

Чтобы уменьшить вероятность взаимоблокировок, используйте транзакции, а не операторы LOCK TABLES

Как возможны взаимоблокировки при использовании LOCK TABLES в InnoDB?

Например, если я напишу

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t4 WRITE;
... do something with tables t1-t4 here ...
COMMIT;
UNLOCK TABLES;

мне действительно нужно проверять ошибки вроде 1213 каждый раз, когда я выполняю этот скрипт?

1

Решение

Если вы уверены, чтобы заблокировать все Таблицы, которые вы будете читать или записывать в одном операторе LOCK TABLES, должны быть в состоянии избежать тупиков.

Но если ваш код ссылается на любые другие таблицы, кроме тех, которые вы заблокировали, то есть риск тупика.

Другая веская причина избегать использования LOCK TABLES, если вместо этого можно использовать транзакции, — разрешить блокировку на уровне строк. LOCK TABLES блокирует только на уровне таблицы, что означает, что одновременные сеансы не могут касаться каких-либо строк в таблице, даже если сеанс не нуждается в их блокировке.

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

Что вы подразумеваете под «использовать t2»? ЧИТАТЬ блокировку? Что делать, если я использую только блокировки ЗАПИСИ, как в моем примере.

Я думаю, что он имеет в виду, если вы читаете из таблицы T2. Поскольку эта таблица заблокирована для WRITE, это включает в себя также блокировку любых читателей этой таблицы. Никакой другой сеанс не может читать или писать таблицу, пока вы не разблокируете.

Я не беспокоюсь о производительности. У меня есть ситуация, когда я хочу сделать вещи максимально простыми, и LOCK TABLES кажется мне гораздо более интуитивным, чем использование транзакций с проверкой ошибок на уровне параноика.

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

1

Другие решения

Других решений пока нет …