JET School

Что такое Phantom Read?

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

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

Предположим, что транзакция выполняет запрос, выбирая данные по определённому условию (например: SELECT * FROM сотрудники WHERE зарплата > 1000). Если транзакция выполнит этот запрос дважды — в начале и в конце своей работы — и получит разные результаты, значит произошло фантомное чтение. Различия возникают из-за того, что другая транзакция добавила или изменила строки, соответствующие условию.

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

  1. Транзакция A: SELECT * FROM сотрудники WHERE зарплата > 1000
  2. Транзакция B: добавляет нового сотрудника с зарплатой 1200.
  3. Транзакция A повторно выполняет тот же запрос и видит нового сотрудника.

Таким образом, транзакция A при повторном выполнении одного и того же запроса получает разные результаты — это и есть фантомное чтение.

Как избежать фантомного чтения?

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

Кратко:

  • Фантомное чтение — получение разного результата одного и того же запроса в рамках одной транзакции.
  • Причина — параллельное добавление или изменение данных другой транзакцией.
  • Решение — использование уровня изоляции Serializable.
  • Важный аспект для обеспечения консистентности данных в базах данных.

Присоединяйтесь к нашим курсам для углубленного изучения области ИТ. Отправьте запрос для получения подробной информации!