Выбор ответа Senior Миграции обновлено
Миграция встала в очередь за долгой транзакцией
Вопрос
Миграция ALTER TABLE orders ADD COLUMN note text (быстрая операция) повесила весь сайт на минуту. Что произошло?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: ALTER ждал блокировку за долгой транзакцией, а новые запросы встали за ним. Даже мгновенному DDL нужна блокировка ACCESS EXCLUSIVE.
Варианты ответа
- ALTER ждал блокировку за долгой транзакцией, а новые запросы встали за нимправильный ответ
- Добавление колонки в PostgreSQL переписывает таблицу целиком под блокировкой
- PostgreSQL перезапустился после DDL, чтобы перечитать каталог системных таблиц
- Миграция удалила и пересоздала индексы таблицы, и запросы шли полным сканированием
Разбор
Даже мгновенному DDL нужна блокировка ACCESS EXCLUSIVE. Если в этот момент идёт долгий запрос или висит транзакция, ALTER ждёт, а все следующие запросы к таблице выстраиваются за ним. Защита: SET lock_timeout = '5s' в миграции и повтор при неудаче, плюс контроль долгих транзакций. Добавление nullable-колонки без дефолта таблицу не переписывает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.