Выбор ответа Senior Базы данных в эксплуатации обновлено

Очередь блокировок

Вопрос

Миграция ALTER TABLE orders ADD COLUMN note text выполняется за миллисекунды, но при её запуске весь сайт завис на минуту. Почему?

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

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

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

Коротко

Правильный ответ: ALTER ждал эксклюзивную блокировку за долгим запросом, остальные встали за ним. Блокировки выдаются по очереди: ALTER запросил эксклюзивную блокировку и ждёт, пока завершится, например, долгий отчёт.

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

  1. Добавление колонки переписывает всю таблицу на диске, а запись в неё в это время стоит
  2. ALTER ждал эксклюзивную блокировку за долгим запросом, остальные встали за нимправильный ответ
  3. PostgreSQL перезапускает бэкенды при изменении схемы таблицы
  4. Колонка типа text требует перестроения всех индексов таблицы

Разбор

Блокировки выдаются по очереди: ALTER запросил эксклюзивную блокировку и ждёт, пока завершится, например, долгий отчёт. Новые SELECT конфликтуют с ожидающим ALTER и встают за ним. Лечится SET lock_timeout = '3s' и повторами миграции. Добавление nullable-колонки без DEFAULT не переписывает таблицу, рестарта нет, индексы не трогаются.

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

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

Термины по теме