REPEATABLE READ: уровень изоляции транзакций уровень изоляции СУБД, который обеспечивает повторяемость чтения защищает от невидимых и неповторяющихся чтений (non-repeatable reads) не позволяет читать строки, изменившиеся в рамках текущей транзакции фантомные чтения (phantom reads) возможны — результат может дополниться новыми строками реализуется с помощью блокировок либо версионирования (MVCC), в зависимости от конкретной СУБД компромисс между высокой изоляцией и производительностью предотвращает неповторяющееся чтение и грязное чтение, поэтому подходит для большинства бизнес-приложений
Что такое уровень изоляции транзакций REPEATABLE READ и от каких проблем он защищает?
REPEATABLE READ: уровень изоляции транзакций уровень изоляции СУБД, который обеспечивает повторяемость чтения защищает от невидимых и неповторяющихся чтений (non-repeatable reads) не позволяет читать строки,…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
REPEATABLE READ: уровень изоляции транзакций
- уровень изоляции СУБД, который обеспечивает повторяемость чтения
- защищает от невидимых и неповторяющихся чтений (non-repeatable reads)
- не позволяет читать строки, изменившиеся в рамках текущей транзакции
- фантомные чтения (phantom reads) возможны — результат может дополниться новыми строками
- реализуется с помощью блокировок либо версионирования (MVCC), в зависимости от конкретной СУБД
- компромисс между высокой изоляцией и производительностью
- предотвращает неповторяющееся чтение и грязное чтение, поэтому подходит для большинства бизнес-приложений
Кратко: REPEATABLE READ гарантирует, что повторное чтение тех же строк в пределах одной транзакции вернёт неизменившиеся данные, однако не во всех реализациях полностью исключает появление новых строк (фантомов).
Подробный ответ
Основной ответ
Уровень изоляции транзакций REPEATABLE READ обеспечивает неизменность всех данных, которые транзакция прочитала до завершения своей работы. Иными словами, если транзакция уже получила строки из базы данных, повторный запрос к этим строкам вернёт тот же результат, даже когда параллельные транзакции пытаются изменить соответствующие данные. REPEATABLE READ исключает такие эффекты, как неповторяющееся чтение (non-repeatable read) и грязное чтение (dirty read), но не во всех случаях предотвращает фантомные чтения (phantom reads).
Ключевые моменты
- Запрет грязных чтений — транзакция не получает данные об изменениях, выполненных другими незакоммиченными транзакциями.
- Защита от неповторяющихся чтений — однажды прочитанные данные сохраняют своё значение до конца транзакции, поэтому промежуточные изменения не приводят к расхождениям.
- Фантомные чтения — в классическом понимании REPEATABLE READ не даёт полной защиты от этого эффекта: например, при следующих запросах могут появиться строки, добавленные другими транзакциями. Однако в таких СУБД, как InnoDB (MySQL), проблема решается применением MVCC и predicate locking.
Практический контекст
В PostgreSQL и InnoDB (MySQL 5.7+) уровень REPEATABLE READ построен на MVCC и предоставляет транзакции согласованный snapshot данных. Благодаря этому достигается разумное соотношение производительности и изоляции. Такой режим часто выбирают для систем, в которых важно исключить непредсказуемое изменение данных во время чтения, но нет необходимости в строгой сериализации всех транзакций.