Проверяет знание транзакций, блокировок и навыки диагностики проблем с конкурентным доступом.
Deadlock — это ситуация, когда две транзакции ждут друг друга и обе никогда не завершатся. В Postgres СУБД сама выявляет дедлок и завершает одну транзакцию с ошибкой. Избежать можно с помощью правильного порядка блокировок и коротких транзакций.
Пример:
Транзакция A блокирует таблицу orders, а затем пытается обновить rooms. Транзакция B наоборот блокирует rooms, а потом orders. Они ждут друг друга бесконечно.
Postgres детектит дедлок и «убивает» одну транзакцию.
Как избежать:
всегда брать блокировки в одинаковом порядке;
сокращать длительность транзакций;
использовать оптимистичные блокировки (версионность, SELECT FOR UPDATE только там, где нужно).
Вывод: дедлоки неизбежны в сложных системах, но их можно минимизировать через порядок действий и проектирование схемы.