Что такое фантомное чтение
Что проверяют
Различаете ли вы три аномалии чтения и понимаете ли, что уровень изоляции это свойство базы, а не Hibernate. Вопрос любят задавать сразу после @Transactional: он показывает, читал ли кандидат про изоляцию или просто расставляет аннотации по образцу.
Как отвечать
Фантом это про состав набора строк, попавших под условие. Транзакция выполняет запрос с предикатом, другая транзакция вставляет или удаляет строку, подходящую под тот же предикат, и повторный запрос возвращает другой состав. Отличие от неповторяющегося чтения принципиальное: там меняется уже прочитанная строка, здесь появляется или исчезает новая.
По стандарту фантомы запрещает только уровень сериализуемости, но реализации отличаются. В InnoDB на повторяемом чтении обычные запросы идут по снимку и фантомов не видят, а блокирующие чтения защищены блокировками промежутков. В PostgreSQL повторяемое чтение это снимок на всю транзакцию, и тот же эффект достигается без блокировок.
В Java важно договорить, что делать дальше. Строгий уровень в @Transactional означает готовность ловить ошибку сериализации и повторять транзакцию целиком. Поле @Version от фантома не спасает: оптимистическая блокировка стережёт конкретную строку, а не диапазон, поэтому проверку «записи нет, значит вставляем» закрывают уникальным индексом и обработкой нарушения ограничения.
Где спотыкаются
Называют фантомом изменение значения в уже прочитанной строке. Это неповторяющееся чтение, и на собеседовании их разводят специально, чтобы услышать разницу.
Считают сериализуемый уровень выполнением транзакций по очереди. Результат обязан совпасть с каким-то последовательным порядком, но идут они параллельно, а конфликт база разрывает ошибкой.
Поднимают уровень изоляции и не добавляют повтор транзакции. Под нагрузкой сервис начинает отдавать ошибки, после чего уровень откатывают обратно вместо того, чтобы написать ретрай.