Ответ 1
http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html
1213 (ER_LOCK_DEADLOCK)
Тупик транзакции. Вы должны повторно запустить транзакции.
Я знаю, что взаимоблокировки неизбежно возникают при использовании транзакций в Innodb и что они безвредны, если они правильно обрабатываются кодом приложения - "просто попробуйте еще раз", как говорится в руководстве.
Итак, мне было интересно - как вы обнаруживаете тупики? Заблокирован ли какой-то специальный номер ошибки mysql? Я использую расширение PHP mysqli, если это имеет значение.
Спасибо.
Изменить: найдено решение, см. комментарии
http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html
1213 (ER_LOCK_DEADLOCK)
Тупик транзакции. Вы должны повторно запустить транзакции.
"SHOW ENGINE INNODB STATUS" из клиента командной строки MySQL (а не браузера запросов) предоставит вам информацию о тупиках.
Тупики также могут быть вызваны незафиксированными транзакциями (как правило, программными ошибками), и лицо, выполняющее незавершенную транзакцию, не увидит проблему, поскольку они будут работать нормально (через их данные не будут зафиксированы).
Попробуйте MaatKit. Он имеет регистратор ошибок.
Попробуйте использовать MONYOG. Включите опцию MONYOG "Контроль взаимоблокировки" для отслеживания тупиков, о которых сообщает INNODB STATUS. MONYOG отправит предупреждение пользователю, когда произойдет новый тупик.
Попробуйте innotop, обнаружит тупик для вас.
Если вы находитесь на mac:
$brew установить percona-toolkit
$pt-deadlock-logger -uroot -ask-pass localhost
Недавно я создал очень простую проверку на наличие взаимоблокировок для реализации дымового теста веб-приложения. Код можно много улучшить, но пока он работает. См. Https://dev.mysql.com/doc/refman/8.0/en/innodb-standard-monitor.html для получения дополнительной информации о выводе используемого запроса ниже.
$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;
if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}
if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}