Распределённые данные · проверено по источникам

Многоверсионное управление доступом (MVCC)

Многоверсионное управление доступом, или MVCC, — способ организовать параллельную работу с данными через несколько версий строк. Снимок определяет видимые версии, поэтому обычному чтению не нужно ждать, пока закончится каждое изменение тех же данных.

Также ищут: Multiversion Concurrency Control · MVCC · многоверсионное управление конкурентностью

Практический смысл

Почему это важно

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

Доказательная часть

Что подтверждено

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

    Граница применимости: PostgreSQL 18, обычный SELECT; собственные изменения транзакции учитываются отдельно.

  2. В PostgreSQL обычный SELECT и изменение строк не блокируют друг друга только ради видимости этих строк. Это не обещание отсутствия любых ожиданий: SELECT может ждать табличную блокировку ACCESS EXCLUSIVE, а SELECT FOR UPDATE сам использует блокировки строк.

    Граница применимости: PostgreSQL 18, различие обычного многоверсионного чтения, явной блокировки строк и команд изменения структуры таблицы.

  3. При одновременном изменении одной строки PostgreSQL одна транзакция может ждать, пока другая освободит блокировку этой строки. Хранение нескольких версий не превращает параллельную запись одной строки в независимые бесконфликтные операции.

    Граница применимости: PostgreSQL 18, конфликтующие блокировки строк при изменении данных.

  4. PostgreSQL использует MVCC и при Read Committed, и при Repeatable Read, и при Serializable. Эти режимы различаются сроком действия снимка и контролем зависимостей; из одного наличия MVCC нельзя вывести отсутствие аномалий сериализации.

    Граница применимости: PostgreSQL 18; гарантии других реализаций MVCC требуют собственной документации.

  5. UPDATE и DELETE в PostgreSQL не сразу удаляют прежние версии строк. Когда такие версии больше не нужны ни одной транзакции, VACUUM освобождает занятое ими место для повторного использования.

    Граница применимости: PostgreSQL 18, обычная очистка версий строк; отдельные причины удержания истории здесь не исчерпываются.

  6. Активный старый снимок может удерживать версии, которые уже не нужны новым транзакциям. VACUUM не может убрать версию, ещё потенциально видимую такой транзакции. Поэтому длительность читающей транзакции влияет на накопление старых версий наряду с объёмом изменений.

    Граница применимости: PostgreSQL 18, транзакции, действительно удерживающие старый снимок; не всякое открытое соединение удерживает версии.

  7. Обычный VACUUM в общем случае оставляет освобождённое место внутри файла таблицы для новых строк. Успешная очистка не означает пропорционального уменьшения файла на диске; возврат места операционной системе имеет отдельные условия.

    Граница применимости: PostgreSQL 18, обычный VACUUM; возможное освобождение пустых страниц в конце таблицы не превращено в обещание полного сжатия.

Граница терминов

Не путать

Снимок видимости транзакции

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

Сериализуемость

MVCC — механизм работы с версиями, сериализуемость — требование к совместному результату. В PostgreSQL дополнительный контроль Serializable нужен и при наличии многоверсионных снимков.

Перед спецификацией

Что проверить

  1. Уточните СУБД и уровень изоляции каждого важного запроса.
  2. Разделите обычный SELECT, SELECT FOR UPDATE и изменение строк.
  3. Для миграции проверьте требуемую блокировку таблицы и её конфликт с рабочими запросами.
  4. Измерьте ожидания при параллельном изменении одной строки.
  5. Найдите транзакции, долго удерживающие старые снимки.
  6. Проверьте работу autovacuum и скорость накопления старых версий под нагрузкой.
  7. Различайте место, пригодное для повторной записи, и уменьшение файла на диске.
Открытые основания

Первоисточники

  • Официальная документация

    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 года, заголовок документа сверен. Сверить удаление старых версий, удержание их активными транзакциями и повторное использование места.

    Открыть первоисточник
Сообщить об ошибке

Опишите проблему — постараемся исправить как можно скорее.

Спасибо!

Получили ваше сообщение.
Подтвердите действие