Что делает PostgreSQL при deadlock
Вопрос
Транзакция A заблокировала строку 1 и ждёт строку 2, транзакция B заблокировала строку 2 и ждёт строку 1. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Обе будут ждать бесконечно, пока их не убьют вручную
- PostgreSQL откатит обе транзакции и вернёт ошибку
- Через
deadlock_timeoutодна транзакция прервётсяправильный ответ - Блокировки снимутся, и обе транзакции продолжат работу
Разбор
PostgreSQL проверяет граф ожиданий, если блокировку ждут дольше deadlock_timeout (по умолчанию 1 секунда), и прерывает одну из транзакций с ошибкой «deadlock detected»; вторая продолжает. Вечного ожидания нет, обе не откатываются, и блокировки без завершения транзакции не снимаются. Профилактика: захватывать строки в одном порядке, например по возрастанию id.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Зачем нужна заморозка и что такое wraparound
Следующий вопрос
Уровень изоляции по умолчанию в PostgreSQL