Уровень изоляции — режим гарантий. Снимок определяет видимый набор версий для чтения в этом режиме. В PostgreSQL 18 новый снимок обычного SELECT на Read Committed и снимок транзакции на Repeatable Read дают разное поведение при изменении цены между чтениями.
Почему это важно
Для просмотра каталога, расчёта заказа по нескольким строкам и совместной проверки кредитного лимита могут понадобиться разные гарантии. Выбирайте режим по требуемому результату и устройству операции. В PostgreSQL 18 важны не только названия Read Committed, Repeatable Read и Serializable, но и моменты снимков, конфликты записи и готовность повторить работу.
Что подтверждено
Документация PostgreSQL 18 различает уровни SQL по грязному чтению, неповторяемому чтению, фантомному чтению и аномалии сериализации. Serializable запрещает все четыре; для более слабых уровней нужно отдельно смотреть, какие аномалии разрешены и что дополнительно предотвращает реализация.
Граница применимости: Таблица уровней и аномалий SQL в PostgreSQL 18; не независимое цитирование текста стандарта SQL.
В PostgreSQL 18 Read Uncommitted ведёт себя как Read Committed, поэтому грязные чтения недоступны. Repeatable Read дополнительно предотвращает фантомные чтения, хотя минимальное определение этого уровня в таблице SQL такой защиты не требует.
Граница применимости: Фактическая реализация PostgreSQL 18 в сравнении с минимальными условиями уровней, приведёнными в её документации.
Read Committed — уровень PostgreSQL 18 по умолчанию. Обычный SELECT видит данные, зафиксированные до начала команды, и собственные предшествующие изменения транзакции. Следующий SELECT может использовать более новый снимок и увидеть зафиксированную между командами правку.
Граница применимости: PostgreSQL 18, обычный SELECT без явной блокировки; правила поиска и изменения строк у UPDATE и блокирующих команд имеют дополнительные особенности.
В PostgreSQL 18 Repeatable Read закрепляет снимок на начало первой команды транзакции, не являющейся командой управления транзакцией. Повторные обычные чтения не подхватывают чужие последующие фиксации, но аномалии сериализации всё ещё возможны; неизменный снимок не доказывает последовательную эквивалентность.
Граница применимости: PostgreSQL 18, Repeatable Read; собственные изменения транзакции видны, а конкретный конфликт записи может привести к отказу и повтору.
Serializable в PostgreSQL 18 отслеживает опасные взаимодействия и может отменить транзакцию с ошибкой сериализации. Приложение обязано уметь повторить её целиком; сам выбор уровня не означает, что каждая конкурентная попытка завершится успехом с первого раза.
Граница применимости: PostgreSQL 18, Serializable и обработка отказов сериализации; гарантия относится к успешно завершённым транзакциям.
На PostgreSQL 18 Repeatable Read попытка изменить строку, которую конкурент изменил и зафиксировал после начала снимка, может завершиться ошибкой сериализации. Режим обеспечивает стабильную видимость, но не обещает, что вычисленное по старой версии изменение всегда удастся записать.
Граница применимости: PostgreSQL 18, Repeatable Read, конкурентное изменение целевой строки; после отказа повторяют всю транзакцию.
Не путать
Сериализуемость требует результата, эквивалентного некоторому последовательному выполнению транзакций. Уровень Serializable предоставляет эту гарантию для успешных транзакций. Другие уровни нельзя признать сериализуемыми только потому, что тест не обнаружил грязных или фантомных чтений.
Что проверить
- Зафиксируйте СУБД, версию и фактический уровень внутри проверяемой транзакции.
- Выберите нужную гарантию для конкретной операции: новое чтение текущей цены, стабильный расчёт или согласованный результат нескольких транзакций.
- В двух сеансах проверьте изменение одной строки, появление строки в выборке и совместное нарушение правила по нескольким строкам.
- Проверьте, когда появляется первый снимок, и учитывайте собственные изменения транзакции при сравнении чтений.
- На Repeatable Read вызовите конфликт записи поверх изменённой конкурентом строки и проверьте обработку отказа.
- На Serializable проверьте повтор всей транзакции с повторным чтением исходных данных и пересчётом решения.
- Измерьте задержку, ожидания и число повторов на рабочем распределении запросов; закрепите допустимые результаты в приёмочных сценариях.
Первоисточники
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.
Открыть первоисточник