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

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

Снимок видимости — правило выбора версий строк, доступных запросу или транзакции. В PostgreSQL он отделяет видимые зафиксированные изменения других транзакций от ещё невидимых. Это логическое представление данных, а не сохранённая копия файлов базы.

Также ищут: Transaction snapshot · database snapshot visibility

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

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

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

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

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

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

    Граница применимости: Логическая видимость обычных многоверсионных запросов PostgreSQL 18.

  2. В PostgreSQL Read Committed каждый обычный SELECT получает снимок на начало своего запроса. В Repeatable Read и Serializable обычные запросы используют снимок, полученный при первой команде транзакции, не управляющей самой транзакцией. Это точнее, чем считать снимок созданным при BEGIN.

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

  3. Сеанс A выполнил BEGIN ISOLATION LEVEL REPEATABLE READ и больше ничего. Затем B изменил остаток и зафиксировал запись. Первый SELECT в A увидит новое значение B: снимок ещё не был получен до этой команды. Момент BEGIN не отсекает такую запись.

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

  4. Повторный SELECT в PostgreSQL видит изменения, выполненные прежними командами своей транзакции, даже если они ещё не зафиксированы. Поэтому фраза «один снимок» не означает, что транзакция перестаёт видеть собственные записи.

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

  5. Если Repeatable Read уже прочитал остаток 10, а другой сеанс затем зафиксировал остаток 0, повторный обычный SELECT первой транзакции продолжит видеть 10. Это ожидаемая стабильность снимка, а не доказательство текущего наличия товара.

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

  6. В Read Committed команда UPDATE может дождаться параллельного изменения целевой строки и заново проверить условие WHERE на её обновлённой версии. Правило видимости обычного SELECT поэтому нельзя переносить на все действия пишущей команды без оговорок.

    Граница применимости: PostgreSQL 18, UPDATE существующей строки при конфликтующей параллельной записи в Read Committed.

  7. Снимок видимости MVCC определяет доступные версии внутри работающей базы. Снимок виртуальной машины сохраняет её состояние и имеет собственные зависимости. Первое не является вторым и само не создаёт материалов для восстановления после потери базы.

    Граница применимости: Сравнение снимка запросов PostgreSQL и снимка виртуальной машины по NIST; физические снимки хранилищ требуют отдельного описания.

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

Не путать

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

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

Snapshot (снимок состояния)

Снимок видимости — логическое представление строк для запроса. Снимок виртуальной машины — сохранённое состояние системы. Они решают разные задачи и не заменяют друг друга при восстановлении.

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

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

  1. Проверьте уровень изоляции в самом рабочем соединении.
  2. Зафиксируйте первую обычную команду после BEGIN: она может определять начало снимка.
  3. Для двух SELECT отметьте момент фиксации параллельной записи относительно каждого запроса.
  4. Уточните, нужен ли отчёту стабильный срез или каждому чтению более свежее состояние.
  5. Отдельно учтите изменения предыдущих команд своей транзакции.
  6. Для UPDATE и блокирующего чтения проверьте правила конфликта, не ограничиваясь поведением SELECT.
  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.

    Открыть первоисточник
  • Официальная документация

    Snapshot — CSRC Glossary

    National Institute of Standards and Technology · CSRC glossary по NIST SP 800-125, проверено 29 августа 2026 года

    Определяет snapshot как запись состояния running image, обычно в виде differences между image и current state.

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

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

Спасибо!

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