innodb_print_all_deadlocks = ON
SHOW ENGINE INNODB STATUS
является переходным процессом;вышесказанное должно сохранить его путем записи в файл журнала.
Я рекомендую несколько вещей, чтобы уменьшить количество взаимоблокировок:
- Делайте то же самоезаказ в разных транзакциях.Это включает в себя, какие строки касаются.
- Ускорить код.(Лучшие индексы, часто «составные», переформулируют запросы и т. Д.)
- Проверьте, можно ли что-нибудь разумно извлечь из
BEGIN
... COMMIT
.
ДляДля дальнейшего обсуждения, пожалуйста, покажите нам SQL в транзакции, плюс SHOW CREATE TABLE
для соответствующих таблиц.
В любом случае проверяйте наличие ошибок в каждой транзакции и будьте готовы к воспроизведению при попадании в тупик.
Примечание: lock_wait_timeout
является связанным элементом.По умолчанию это неоправданно высокие 50 секунд.Если вы поднимаете это, вы просите больше проблем.Уменьшение его (скажем, до 5) не является реальным решением, но оно может изменить проблемы интересным образом.Опять тестируйте на ошибки и реагируйте на них.Попадание в этот «тайм-аут» так же плохо, как и «тупик».Не ударить, а ждать - это тихий способ успешного разрешения конфликтов InnoDB.