Ответ
Фантомное чтение (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(хотя это не всегда предотвращает вставку новых строк).