Фантомное чтение (phantom read) — это аномалия параллельного выполнения транзакций в базах данных. Возникает, когда в рамках одной транзакции при повторном выполнении одного и того же запроса с WHERE условием, выборка возвращает другой набор строк. Это происходит из-за того, что другая транзакция добавила или удалила строки, соответствующие условию, между двумя выполнениями одного и того же запроса в первой транзакции.
Это отличается от не повторяющегося чтения (non-repeatable read), где изменяются значения уже существующих строк. При фантомном чтении меняется именно множество строк.
Пример:
SELECT COUNT(*) FROM accounts WHERE status = 'active', получая 100.accounts со status = 'active'.SELECT COUNT(*) FROM accounts WHERE status = 'active', получая 105. — Это фантомное чтение.СУБД используют уровни изоляции транзакций для предотвращения таких аномалий. Уровень изоляции SERIALIZABLE предотвращает фантомное чтение, гарантируя, что параллельное выполнение транзакций эквивалентно некоторому последовательному выполнению транзакций. Уровни изоляции ниже, такие как REPEATABLE READ, могут предотвращать не повторяющееся чтение, но не фантомное.