Что называют фантомным чтением? Устраняет ли его Repeatable Read? фантомное чтение относится к проблемам транзакций и уровней изоляции проблема возникает при повторном запросе, если в его результатах появляются или пропадают новые строки Repeatable Read обеспечивает повторяемость прочитанных строк, однако не во всех случаях защищает от фантомов для устранения фантомов требуется уровень сериализуемости либо специфические блокировки (например, Predicate Locks) в распространённых СУБД защита Repeatable Read от фантомов часто неполная и зависит от реализации полное решение проблемы обеспечивает уровень изоляции Serializable практический вывод…
Что такое фантомное чтение и устраняет ли его Repeatable Read?
Что называют фантомным чтением? Устраняет ли его Repeatable Read? фантомное чтение относится к проблемам транзакций и уровней изоляции проблема возникает при повторном запросе, если в его результатах появляются или…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Что называют фантомным чтением? Устраняет ли его Repeatable Read?
- фантомное чтение относится к проблемам транзакций и уровней изоляции
- проблема возникает при повторном запросе, если в его результатах появляются или пропадают новые строки
- Repeatable Read обеспечивает повторяемость прочитанных строк, однако не во всех случаях защищает от фантомов
- для устранения фантомов требуется уровень сериализуемости либо специфические блокировки (например, Predicate Locks)
- в распространённых СУБД защита Repeatable Read от фантомов часто неполная и зависит от реализации
- полное решение проблемы обеспечивает уровень изоляции Serializable
- практический вывод — для сохранения целостности данных необходимо правильно выбирать уровень изоляции
Подробный ответ
Основной ответ
Фантомное чтение (phantom read) — это ситуация в транзакционной системе, при которой повторное выполнение того же запроса в рамках одной транзакции возвращает новые строки, отсутствовавшие в первом результате. Иными словами, данные, используемые транзакцией, изменяются "снаружи" под воздействием операций других транзакций, из-за чего поведение системы становится непредсказуемым.
Уровень изоляции Repeatable Read, предусмотренный стандартами SQL, предназначен для сохранения стабильности при повторном чтении тех же строк. Однако он не всегда исключает фантомные чтения: строки, соответствующие условиям запроса, могут быть добавлены. Чтобы полностью устранить такую проблему, применяется уровень Serializable, не допускающий добавления новых подходящих строк.
Ключевые моменты
- При уровне Repeatable Read изменения уже прочитанных строк блокируются, однако вставка новых строк, удовлетворяющих условиям выборки, не всегда запрещена.
- Фантомные чтения возникают, например, при запросах типа
SELECT … WHERE— повторный запуск такого запроса способен вернуть дополнительные строки. - На уровне транзакций Serializable применяется более строгая блокировка, например gap locking в InnoDB. Она не позволяет создавать фантомные записи и обеспечивает полную изоляцию.
Практический контекст
В PostgreSQL уровень Repeatable Read был реализован начиная с версии 9.1. Он гарантирует отсутствие не повторяемых чтений, однако из-за применения MVCC фантомы теоретически остаются возможными; их предотвращение обеспечивает только режим Serializable. В MySQL/InnoDB уровень Repeatable Read использует gap locks, благодаря чему фантомы устраняются, но это связано с конкретной реализацией. Поэтому при разработке высоконадёжных систем уровень изоляции следует выбирать с учётом бизнес-требований.