MVCC хранит и выбирает версии, а снимок задаёт их видимость для конкретного чтения. Один механизм версий может обслуживать снимки разной длительности на разных уровнях изоляции.
Почему это важно
Долгий отчёт и запись заказов могут работать одновременно, но MVCC не устраняет ожидание блокировок и не задаёт уровень изоляции само по себе. Для планирования базы нужно проверить реальные запросы, миграции таблиц и время удержания старых версий: от них зависят задержка и рост занятого места.
Что подтверждено
В PostgreSQL MVCC выбирает версии строк по снимку видимости. Обычное чтение не видит незавершённых изменений другой транзакции и может читать прежнюю подходящую версию, пока параллельная запись создаёт новую.
Граница применимости: PostgreSQL 18, обычный SELECT; собственные изменения транзакции учитываются отдельно.
В PostgreSQL обычный SELECT и изменение строк не блокируют друг друга только ради видимости этих строк. Это не обещание отсутствия любых ожиданий: SELECT может ждать табличную блокировку ACCESS EXCLUSIVE, а SELECT FOR UPDATE сам использует блокировки строк.
Граница применимости: PostgreSQL 18, различие обычного многоверсионного чтения, явной блокировки строк и команд изменения структуры таблицы.
При одновременном изменении одной строки PostgreSQL одна транзакция может ждать, пока другая освободит блокировку этой строки. Хранение нескольких версий не превращает параллельную запись одной строки в независимые бесконфликтные операции.
Граница применимости: PostgreSQL 18, конфликтующие блокировки строк при изменении данных.
PostgreSQL использует MVCC и при Read Committed, и при Repeatable Read, и при Serializable. Эти режимы различаются сроком действия снимка и контролем зависимостей; из одного наличия MVCC нельзя вывести отсутствие аномалий сериализации.
Граница применимости: PostgreSQL 18; гарантии других реализаций MVCC требуют собственной документации.
UPDATE и DELETE в PostgreSQL не сразу удаляют прежние версии строк. Когда такие версии больше не нужны ни одной транзакции, VACUUM освобождает занятое ими место для повторного использования.
Граница применимости: PostgreSQL 18, обычная очистка версий строк; отдельные причины удержания истории здесь не исчерпываются.
Активный старый снимок может удерживать версии, которые уже не нужны новым транзакциям. VACUUM не может убрать версию, ещё потенциально видимую такой транзакции. Поэтому длительность читающей транзакции влияет на накопление старых версий наряду с объёмом изменений.
Граница применимости: PostgreSQL 18, транзакции, действительно удерживающие старый снимок; не всякое открытое соединение удерживает версии.
Обычный VACUUM в общем случае оставляет освобождённое место внутри файла таблицы для новых строк. Успешная очистка не означает пропорционального уменьшения файла на диске; возврат места операционной системе имеет отдельные условия.
Граница применимости: PostgreSQL 18, обычный VACUUM; возможное освобождение пустых страниц в конце таблицы не превращено в обещание полного сжатия.
Не путать
MVCC — механизм работы с версиями, сериализуемость — требование к совместному результату. В PostgreSQL дополнительный контроль Serializable нужен и при наличии многоверсионных снимков.
Что проверить
- Уточните СУБД и уровень изоляции каждого важного запроса.
- Разделите обычный SELECT, SELECT FOR UPDATE и изменение строк.
- Для миграции проверьте требуемую блокировку таблицы и её конфликт с рабочими запросами.
- Измерьте ожидания при параллельном изменении одной строки.
- Найдите транзакции, долго удерживающие старые снимки.
- Проверьте работу autovacuum и скорость накопления старых версий под нагрузкой.
- Различайте место, пригодное для повторной записи, и уменьшение файла на диске.
Первоисточники
PostgreSQL 18 Documentation: Introduction to MVCC
PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.1
Объясняет multiversion snapshots и границу между MVCC и explicit locking.
Открыть первоисточникPostgreSQL 18 Documentation: Transaction Isolation
PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.2
Определяет isolation phenomena и фактическое поведение PostgreSQL levels, включая Serializable.
Открыть первоисточникPostgreSQL 18 Documentation: Explicit Locking
PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года
Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить блокировки строк SELECT FOR UPDATE, ожидание конкурирующих изменений и срок удержания до конца транзакции.
Открыть первоисточникPostgreSQL 18 Documentation: Routine Vacuuming
PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года
Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Сверить удаление старых версий, удержание их активными транзакциями и повторное использование места.
Открыть первоисточник