Middle+
84
questionbank

Что такое фантомное чтение?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Фантомное чтение (phantom read) — это аномалия параллельного выполнения транзакций в базах данных. Возникает, когда в рамках одной транзакции при повторном выполнении одного и того же запроса с WHERE условием, выборка возвращает другой набор строк. Это происходит из-за того, что другая транзакция добавила или удалила строки, соответствующие условию, между двумя выполнениями одного и того же запроса в первой транзакции.

Это отличается от не повторяющегося чтения (non-repeatable read), где изменяются значения уже существующих строк. При фантомном чтении меняется именно множество строк.

Пример:

  1. Транзакция A выполняет запрос SELECT COUNT(*) FROM accounts WHERE status = 'active', получая 100.
  2. Транзакция B добавляет 5 новых записей accounts со status = 'active'.
  3. Транзакция A снова выполняет SELECT COUNT(*) FROM accounts WHERE status = 'active', получая 105. — Это фантомное чтение.

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