Идея MVCC
MVCC — это подход, при котором база не перезаписывает строку «в лоб», а создаёт новую версию записи. Читающие транзакции видят не «текущую таблицу», а согласованный snapshot, который соответствует моменту начала транзакции или её запросу, в зависимости от уровня изоляции.
Это позволяет избежать того, чтобы обычные SELECT блокировали UPDATE и наоборот.
Как это работает в PostgreSQL
У каждой строки есть служебные поля версии, связанные с транзакциями. Когда строка обновляется, старая версия не исчезает мгновенно: создаётся новая версия, а старая остаётся видимой тем транзакциям, которым она ещё нужна.
Потом «мёртвые» версии убирает VACUUM и его процессы, освобождая место и предотвращая разрастание таблиц.
Что это даёт
чтения обычно не блокируют записи;
записи обычно не блокируют чтения;
транзакции видят стабильный снимок данных;
лучше масштабируется конкурентный доступ, чем при наивной блокировке всей строки на чтение.
Какие есть побочные эффекты
накапливаются «мёртвые» версии строк, если VACUUM не успевает;
может расти bloat таблиц и индексов;
долгие транзакции мешают уборке старых версий;
нужно следить за autovacuum и возрастом транзакций.
Чем это отличается от блокировок
MVCC не отменяет блокировки вообще — для изменений и конфликтующих операций они всё равно нужны. Но вместо того чтобы блокировать читателей, PostgreSQL чаще даёт им читать подходящую версию строки, а конфликты решает на уровне версий и снимков.
Как ответить на собеседовании
MVCC в PostgreSQL — это механизм многоверсионной конкурентности: база хранит несколько версий строки, а транзакции читают согласованный snapshot без блокировки обычных SELECT. Это даёт хорошую параллельность, но требует VACUUM для удаления старых версий и контроля за bloat и длинными транзакциями.