Очередь блокировок
Вопрос
Миграция ALTER TABLE orders ADD COLUMN note text выполняется за миллисекунды, но при её запуске весь сайт завис на минуту. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Добавление колонки переписывает всю таблицу на диске, а запись в неё в это время стоит
- ALTER ждал эксклюзивную блокировку за долгим запросом, остальные встали за нимправильный ответ
- PostgreSQL перезапускает бэкенды при изменении схемы таблицы
- Колонка типа text требует перестроения всех индексов таблицы
Разбор
Блокировки выдаются по очереди: ALTER запросил эксклюзивную блокировку и ждёт, пока завершится, например, долгий отчёт. Новые SELECT конфликтуют с ожидающим ALTER и встают за ним. Лечится SET lock_timeout = '3s' и повторами миграции. Добавление nullable-колонки без DEFAULT не переписывает таблицу, рестарта нет, индексы не трогаются.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Индекс на горячей таблице
Следующий вопрос
Восстановление PostgreSQL на момент времени