Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: transaction, isolation, anomaly

Что такое фантомное чтение (phantom read)? Решает ли эту проблему Repeatable Read?

Вопрос проверяет знание конкретной аномалии уровня изоляции и понимание границ защиты, предоставляемых уровнем Repeatable Read.

Короткий ответ

Фантомное чтение — это аномалия, при которой транзакция повторно выполняет запрос, возвращающий набор строк по условию, и обнаруживает, что в результирующий набор добавились новые («фантомные») строки, которые были добавлены и зафиксированы другой транзакцией в промежутке между выполнениями запроса. Уровень изоляции Repeatable Read не решает проблему фантомного чтения в стандарте SQL. Для его предотвращения требуется более строгий уровень изоляции — Serializable.

Длинный ответ

Фантомное чтение — это одна из классических аномалий, которые уровни изоляции призваны предотвращать.

Пример фантомного чтения:

  1. Транзакция 1 выполняет запрос: SELECT * FROM users WHERE age > 30; Возвращается 10 строк.

  2. Транзакция 2 выполняется, добавляет нового пользователя с age=35 и фиксирует изменения (COMMIT).

  3. Транзакция 1 повторно выполняет тот же запрос SELECT * FROM users WHERE age > 30;. Теперь возвращается 11 строк.

Новая, 11-я строка, является «фантомом» для Транзакции 1, так как она появилась между двумя идентичными запросами.

Почему Repeatable Read не предотвращает фантомы?

  • Уровень Repeatable Read гарантирует, что уже прочитанные строки не изменятся. Он использует снимок данных или блокировки на существующие строки, удовлетворяющие условию.

  • Однако он не блокирует диапазон или условие запроса от вставки новых строк, которые могли бы удовлетворить условию WHERE age > 30.

  • Таким образом, другая транзакция может свободно вставить новую строку с age=35, и она станет видимой при повторном выполнении запроса в первой транзакции, если используется MVCC.

Как предотвратить фантомное чтение?

  • Для полного предотвращения требуется уровень изоляции Serializable.

  • На этом уровне СУБД использует более строгие механизмы, такие как блокировки диапазона (range locks) или преддикатные блокировки, которые физически предотвращают вставку строк, удовлетворяющих условию запроса другой транзакции.

Вывод: Фантомное чтение — это аномалия, связанная с появлением новых строк. Repeatable Read защищает от изменения уже существующих данных, но не от вставки новых данных, соответствующих условию запроса. Для полной изоляции от всех аномалий, включая фантомы, необходим уровень Serializable.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

Ключевые слова

#transaction

#isolation

#anomaly

Подпишись на Python Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.