Что такое аномалия фантомного чтения в базах данных? Приведите пример.

«Что такое аномалия фантомного чтения в базах данных? Приведите пример.» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример на SQL:

-- Транзакция 1 (Уровень изоляции READ COMMITTED или REPEATABLE READ)
BEGIN TRANSACTION;
-- Первое чтение: 3 пользователя старше 18 лет
SELECT * FROM users WHERE age > 18;
-- Результат: 3 строки

-- Параллельно выполняется Транзакция 2 и добавляет нового пользователя
-- Транзакция 2: INSERT INTO users (name, age) VALUES ('Анна', 25);
-- Транзакция 2 коммитится

-- Транзакция 1 повторяет тот же запрос
SELECT * FROM users WHERE age > 18;
-- Второе чтение: теперь 4 строки! Появился «фантом».
COMMIT;

Почему это проблема? Транзакция 1 получила неконсистентные данные, что может нарушить бизнес-логику (например, при подсчете итогов).

Решение:

  • Установить уровень изоляции транзакций SERIALIZABLE. Он блокирует диапазоны записей, предотвращая вставку «фантомов».
  • Использовать пессимистичные блокировки, например, SELECT ... FOR UPDATE (хотя это не всегда предотвращает вставку новых строк).