PRO

Что такое MVCC в PostgreSQL?

MVCC (Multi-Version Concurrency Control) — это модель конкурентного доступа, при которой PostgreSQL хранит несколько версий одной строки и даёт транзакциям согласованный снимок данных без жёсткой блокировки чтения. Благодаря этому чтения обычно не блокируют записи и наоборот, а старые версии строк потом убираются VACUUM.
Подробный ответ

Идея MVCC

MVCC — это подход, при котором база не перезаписывает строку «в лоб», а создаёт новую версию записи. Читающие транзакции видят не «текущую таблицу», а согласованный snapshot, который соответствует моменту начала транзакции или её запросу, в зависимости от уровня изоляции.

Это позволяет избежать того, чтобы обычные SELECT блокировали UPDATE и наоборот.

Как это работает в PostgreSQL

У каждой строки есть служебные поля версии, связанные с транзакциями. Когда строка обновляется, старая версия не исчезает мгновенно: создаётся новая версия, а старая остаётся видимой тем транзакциям, которым она ещё нужна.

Потом «мёртвые» версии убирает VACUUM и его процессы, освобождая место и предотвращая разрастание таблиц.

Что это даёт

  • чтения обычно не блокируют записи;

  • записи обычно не блокируют чтения;

  • транзакции видят стабильный снимок данных;

  • лучше масштабируется конкурентный доступ, чем при наивной блокировке всей строки на чтение.

Какие есть побочные эффекты

  • накапливаются «мёртвые» версии строк, если VACUUM не успевает;

  • может расти bloat таблиц и индексов;

  • долгие транзакции мешают уборке старых версий;

  • нужно следить за autovacuum и возрастом транзакций.

Чем это отличается от блокировок

MVCC не отменяет блокировки вообще — для изменений и конфликтующих операций они всё равно нужны. Но вместо того чтобы блокировать читателей, PostgreSQL чаще даёт им читать подходящую версию строки, а конфликты решает на уровне версий и снимков.

Как ответить на собеседовании

MVCC в PostgreSQL — это механизм многоверсионной конкурентности: база хранит несколько версий строки, а транзакции читают согласованный snapshot без блокировки обычных SELECT. Это даёт хорошую параллельность, но требует VACUUM для удаления старых версий и контроля за bloat и длинными транзакциями.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге