SobesLab логотип SobesLab

Ответ

Дедлок — это ситуация взаимной блокировки, когда две (или более) транзакции ожидают освобождения ресурсов друг от друга и ни одна не может продолжить. В контексте базы данных дедлок обычно возникает, если транзакция A захватила блокировку на ресурс X и ждёт ресурс Y, а транзакция B захватила Y и ждёт X (или аналогичные сложные цепочки). Обе зациклились, каждая ждёт, что другая закончится и отпустит ресурс. СУБД обнаруживает такие циклы блокировок (обычно по таймауту или специальному алгоритму) и автоматически прерывает (откатывает) одну из транзакций, чтобы разблокировать ситуацию. Приложение получит ошибку о дедлоке (deadlock detected) для одной транзакции — и обычно должно повторить транзакцию. Дедлоки чаще случаются при интенсивных конкурентных обновлениях связанных таблиц в разных порядках. Чтобы избегать дедлоков, рекомендуется: блокировать (обновлять) ресурсы в согласованном порядке (например, всегда таблица A потом B), держать транзакции как можно короче, избегать длительных блокирующих операций внутри транзакции.