Вопрос проверяет понимание прокси-механизма Spring и ограничений транзакционного управления.
@Transactional не срабатывает, если метод вызывается напрямую внутри того же класса. Также она не работает для private методов. Проблемы возникают при неправильной конфигурации прокси. Еще одна частая причина — выбрасывание исключений, которые не приводят к rollback. Все эти случаи связаны с тем, как Spring применяет транзакции.
Работа @Transactional основана на AOP и прокси-объектах.
Spring:
создает прокси вокруг бина
перехватывает вызовы методов
открывает и закрывает транзакцию
Если вызов проходит мимо прокси, транзакция не создается.
Если метод класса вызывает другой метод этого же класса:
вызов идет напрямую
прокси не участвует
транзакция не применяется
@Transactional:
не работает для private методов
работает для public (по умолчанию)
По умолчанию rollback происходит:
только для RuntimeException и Error
Checked-исключения:
не вызывают rollback без настройки
Аннотация не сработает, если:
бин не управляется Spring
отключено транзакционное управление
выносить транзакционные методы в отдельные бины
использовать rollbackFor
проверять способ вызова методов
Вывод: если вызов не проходит через прокси Spring, @Transactional работать не будет.