Выбор ответа Senior Миграции обновлено

Миграция встала в очередь за долгой транзакцией

Вопрос

Миграция ALTER TABLE orders ADD COLUMN note text (быстрая операция) повесила весь сайт на минуту. Что произошло?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ALTER ждал блокировку за долгой транзакцией, а новые запросы встали за ним. Даже мгновенному DDL нужна блокировка ACCESS EXCLUSIVE.

Варианты ответа

  1. ALTER ждал блокировку за долгой транзакцией, а новые запросы встали за нимправильный ответ
  2. Добавление колонки в PostgreSQL переписывает таблицу целиком под блокировкой
  3. PostgreSQL перезапустился после DDL, чтобы перечитать каталог системных таблиц
  4. Миграция удалила и пересоздала индексы таблицы, и запросы шли полным сканированием

Разбор

Даже мгновенному DDL нужна блокировка ACCESS EXCLUSIVE. Если в этот момент идёт долгий запрос или висит транзакция, ALTER ждёт, а все следующие запросы к таблице выстраиваются за ним. Защита: SET lock_timeout = '5s' в миграции и повтор при неудаче, плюс контроль долгих транзакций. Добавление nullable-колонки без дефолта таблицу не переписывает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.