awesome-everything EN
↑ Обратно к восхождению

Базы данных

MVCC: как Postgres раздаёт согласованные снимки

Суть MVCC хранит историю версий строк, чтобы читатели никогда не блокировали писателей, а писатели — читателей; обратная сторона — накопление мёртвых tuple, которые убирает VACUUM.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 12 min

Пятиминутный аналитический запрос и тысячи транзакций оформления заказов идут параллельно. Ни один не блокирует другой. Как Postgres это делает?

Что делает MVCC

MVCC хранит историю каждой строки так, чтобы каждая транзакция видела стабильную картину базы, не блокируя строки, которые трогают другие.

Без MVCC пятиминутный аналитический запрос замораживал бы каждый входящий заказ, а твой дашборд либо врал бы про итоги, либо блокировал кнопку оформления.

Метафора

Представь шумную библиотеку, где у каждой книги много копий, помеченных датой, когда их взяли с полки. Когда Свен просит «каталог на момент, когда я начал читать», библиотекарь выдаёт ему помеченную копию, замороженную на ту минуту — даже если Отто в это же время за стойкой сшивает новое издание.

Свен спокойно читает свою копию. Отто добавляет новое издание. Никто не ждёт никого; оба смотрят на разные датированные копии одной полки.

Позже уборщик проходит и выкидывает копии, которые никто больше не читает. Эта уборка — то, что Postgres называет VACUUM. Уборщик выбрасывает копию только тогда, когда ни один читатель её больше не держит.

Свен и Отто

Свен — сервер приложения, запустивший месячный отчёт. Отто — база с тысячами заказов в секунду.

Без MVCC отчёт либо блокирует orders (заморозив оформление), либо видит недописанные обновления. С MVCC Свен получает snapshot на момент старта отчёта; новые заказы идут в свежие версии, невидимые Свену. Отчёт заканчивается, оформление не зависает.

Одна ловушка, которую MVCC не решает

Две вкладки редактируют один профиль. Вкладка A загрузила, ты печатаешь. B загрузила, изменила одно поле, сохранила. Сохраняешь A — правка B молча исчезла. Это lost update.

MVCC сам по себе не лечит — попроси базу (SELECT FOR UPDATE или строже уровень изоляции).

Как это выглядит на диске

Без MVCCС MVCC
Строка перезаписывается на местеСтарая версия остаётся, новая добавляется рядом
Читатель ждёт писателяЧитатель видит старую версию, не ждёт
Откат — перезапись обратноОткат — просто игнорировать новую версию
Нет истории для точки восстановленияSnapshot транзакции всегда согласован

Проверь себя

Викторина

Что на самом деле делает MVCC?

Викторина

Долгий аналитический запрос и активный поток оформления заказов идут одновременно. Что произойдёт с MVCC?

Расставь шаги по порядку

Поставь в правильном порядке жизненный цикл одного обновления строки:

  1. 1 Транзакция A начинается; получает snapshot с тегом своего transaction id
  2. 2 Транзакция A читает строку в версии v1 — версии, помеченной до старта A
  3. 3 Транзакция B обновляет строку, создавая версию v2 с тегом transaction id B
  4. 4 Транзакция B коммитит — v2 теперь видна для новых снимков
  5. 5 Транзакция A всё ещё читает v1, потому что её snapshot разрешает именно это
  6. 6 Когда v1 больше никому не нужна, VACUUM помечает её слот переиспользуемым
Закончи аналогию

Заполни пропуск: MVCC — это библиотека, где каждый читатель получает датированную _______ вместо самой книги с полки.

Вспомните перед уходом
  1. 01
    Одним предложением: почему пятиминутный аналитический запрос в Postgres не блокирует записи оформления заказов?
  2. 02
    Lost update — это аномалия, которую MVCC решает автоматически, или её должно решать приложение?
  3. 03
    Зачем нужен VACUUM, если MVCC уже выдаёт согласованные данные без него?
Recap
  • MVCC хранит несколько версий каждой строки; читатели и писатели никогда не блокируют друг друга
  • Каждая транзакция получает snapshot — замороженную картину базы на момент её старта
  • UPDATE создаёт новую версию, DELETE только помечает старую мёртвой — физического удаления нет
  • Мёртвые версии накапливаются; VACUUM помечает их переиспользуемыми (не возвращает диск ОС)
  • Lost update MVCC не решает — нужен SELECT FOR UPDATE или строжайший уровень изоляции
Связанные уроки
встречается в147
Продолжить восхождение ↑Заголовок tuple и механика снимков
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.