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

Уровень изоляции транзакций

Уровень изоляции транзакций — выбранный режим гарантий параллельной работы в конкретной СУБД. Он определяет допустимые аномалии и видимость данных; одинаковое название уровня не гарантирует одинаковую реализацию у разных продуктов.

Также ищут: Transaction isolation level · уровень изоляции · SQL isolation level

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

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

Для просмотра каталога, расчёта заказа по нескольким строкам и совместной проверки кредитного лимита могут понадобиться разные гарантии. Выбирайте режим по требуемому результату и устройству операции. В PostgreSQL 18 важны не только названия Read Committed, Repeatable Read и Serializable, но и моменты снимков, конфликты записи и готовность повторить работу.

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

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

  1. Документация PostgreSQL 18 различает уровни SQL по грязному чтению, неповторяемому чтению, фантомному чтению и аномалии сериализации. Serializable запрещает все четыре; для более слабых уровней нужно отдельно смотреть, какие аномалии разрешены и что дополнительно предотвращает реализация.

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

  2. В PostgreSQL 18 Read Uncommitted ведёт себя как Read Committed, поэтому грязные чтения недоступны. Repeatable Read дополнительно предотвращает фантомные чтения, хотя минимальное определение этого уровня в таблице SQL такой защиты не требует.

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

  3. Read Committed — уровень PostgreSQL 18 по умолчанию. Обычный SELECT видит данные, зафиксированные до начала команды, и собственные предшествующие изменения транзакции. Следующий SELECT может использовать более новый снимок и увидеть зафиксированную между командами правку.

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

  4. В PostgreSQL 18 Repeatable Read закрепляет снимок на начало первой команды транзакции, не являющейся командой управления транзакцией. Повторные обычные чтения не подхватывают чужие последующие фиксации, но аномалии сериализации всё ещё возможны; неизменный снимок не доказывает последовательную эквивалентность.

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

  5. Serializable в PostgreSQL 18 отслеживает опасные взаимодействия и может отменить транзакцию с ошибкой сериализации. Приложение обязано уметь повторить её целиком; сам выбор уровня не означает, что каждая конкурентная попытка завершится успехом с первого раза.

    Граница применимости: PostgreSQL 18, Serializable и обработка отказов сериализации; гарантия относится к успешно завершённым транзакциям.

  6. На PostgreSQL 18 Repeatable Read попытка изменить строку, которую конкурент изменил и зафиксировал после начала снимка, может завершиться ошибкой сериализации. Режим обеспечивает стабильную видимость, но не обещает, что вычисленное по старой версии изменение всегда удастся записать.

    Граница применимости: PostgreSQL 18, Repeatable Read, конкурентное изменение целевой строки; после отказа повторяют всю транзакцию.

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

Не путать

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

Уровень изоляции — режим гарантий. Снимок определяет видимый набор версий для чтения в этом режиме. В PostgreSQL 18 новый снимок обычного SELECT на Read Committed и снимок транзакции на Repeatable Read дают разное поведение при изменении цены между чтениями.

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

Сериализуемость требует результата, эквивалентного некоторому последовательному выполнению транзакций. Уровень Serializable предоставляет эту гарантию для успешных транзакций. Другие уровни нельзя признать сериализуемыми только потому, что тест не обнаружил грязных или фантомных чтений.

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

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

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

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

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

    PostgreSQL 18 Documentation: Transaction Isolation

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.2

    Определяет isolation phenomena и фактическое поведение PostgreSQL levels, включая Serializable.

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

    PostgreSQL 18 Documentation: Introduction to MVCC

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.1

    Объясняет multiversion snapshots и границу между MVCC и explicit locking.

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

    The Transaction Model — Turing Award Lecture

    Microsoft Research / ACM · Jim Gray, FCRC 1999 lecture slides

    Первичный обзор transaction model, ACID, concurrency anomalies, logs и two-phase commit.

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

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

Спасибо!

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