deadlock detected.
Как решать проблемы deadlock?
Подробный ответ
Что такое deadlock
Deadlock — это взаимная блокировка: транзакция A удерживает ресурс 1 и ждёт ресурс 2, а транзакция B удерживает ресурс 2 и ждёт ресурс 1. В итоге обе стоят, потому что каждая ждёт другую.
СУБД обычно умеет обнаруживать deadlock и прерывать одну из транзакций, чтобы разорвать цикл.
Почему он возникает
разные транзакции берут блокировки в разном порядке;
слишком большие транзакции держат locks долго;
запросы затрагивают больше строк, чем ожидалось, из-за отсутствия подходящих индексов;
внутри одной бизнес‑операции слишком много шагов и таблиц.
Как минимизировать deadlock
захватывать ресурсы всегда в одном и том же порядке;
делать транзакции короткими и предсказуемыми;
уменьшать число строк, которые реально блокируются, через хорошие индексы и точные условия
WHERE;не смешивать в одной транзакции долгие внешние вызовы и работу с БД;
не обновлять одни и те же сущности из разных потоков с разным порядком;
по возможности использовать более низкий уровень блокировок или оптимистическую конкуренцию, если это приемлемо.
Что делать в приложении
ловить ошибку deadlock и делать повторную попытку (
retry) с backoff;сделать операции идемпотентными, чтобы повтор не ломал бизнес‑логику;
логировать запросы и контекст транзакций, чтобы находить проблемные места;
анализировать
EXPLAIN, lock wait graph и статистику блокировок.
Практический ответ
Deadlock я решаю не только на уровне кода, но и на уровне архитектуры: унифицирую порядок захвата ресурсов, сокращаю транзакции, улучшаю индексы и добавляю retry для транзакций, которые были оборваны СУБД. Если deadlock повторяется, это почти всегда сигнал, что нужно пересмотреть модель доступа к данным, а не просто увеличить таймауты.
Оцени свой прогресс