PRO

Как решать проблемы deadlock?

Deadlock возникает, когда две или больше транзакций ждут блокировки друг друга и ни одна не может продолжить работу. Решают его через единый порядок захвата ресурсов, короткие транзакции, правильные индексы, уменьшение зоны блокировок и автоматический retry после ошибки deadlock detected.
Подробный ответ

Что такое deadlock

Deadlock — это взаимная блокировка: транзакция A удерживает ресурс 1 и ждёт ресурс 2, а транзакция B удерживает ресурс 2 и ждёт ресурс 1. В итоге обе стоят, потому что каждая ждёт другую.

СУБД обычно умеет обнаруживать deadlock и прерывать одну из транзакций, чтобы разорвать цикл.

Почему он возникает

  • разные транзакции берут блокировки в разном порядке;

  • слишком большие транзакции держат locks долго;

  • запросы затрагивают больше строк, чем ожидалось, из-за отсутствия подходящих индексов;

  • внутри одной бизнес‑операции слишком много шагов и таблиц.

Как минимизировать deadlock

  • захватывать ресурсы всегда в одном и том же порядке;

  • делать транзакции короткими и предсказуемыми;

  • уменьшать число строк, которые реально блокируются, через хорошие индексы и точные условия WHERE;

  • не смешивать в одной транзакции долгие внешние вызовы и работу с БД;

  • не обновлять одни и те же сущности из разных потоков с разным порядком;

  • по возможности использовать более низкий уровень блокировок или оптимистическую конкуренцию, если это приемлемо.

Что делать в приложении

  • ловить ошибку deadlock и делать повторную попытку (retry) с backoff;

  • сделать операции идемпотентными, чтобы повтор не ломал бизнес‑логику;

  • логировать запросы и контекст транзакций, чтобы находить проблемные места;

  • анализировать EXPLAIN, lock wait graph и статистику блокировок.

Практический ответ

Deadlock я решаю не только на уровне кода, но и на уровне архитектуры: унифицирую порядок захвата ресурсов, сокращаю транзакции, улучшаю индексы и добавляю retry для транзакций, которые были оборваны СУБД. Если deadlock повторяется, это почти всегда сигнал, что нужно пересмотреть модель доступа к данным, а не просто увеличить таймауты.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге