Ответ
Транзакция не будет создана из-за особенностей работы Spring AOP (проксирование). Аннотация @Transactional обрабатывается Spring-прокси, который перехватывает только внешние вызовы.
Пример проблемы:
@Service
public class UserService {
public void nonTransactionalMethod() {
// Внутренний вызов - транзакция НЕ создается
transactionalMethod();
}
@Transactional
public void transactionalMethod() {
// Операции с БД выполняются без транзакции
}
}
Почему так происходит:
- Spring создает прокси вокруг бина
@Transactionalперехватывается только при вызове через прокси- Внутренние вызовы внутри класса обходят прокси
Решения:
- Вынести метод в отдельный сервис
- Использовать самовызов через AopContext:
((UserService) AopContext.currentProxy()).transactionalMethod(); - Применить TransactionTemplate:
transactionTemplate.execute(status -> { // транзакционная логика return null; }); - Использовать аспекты с режимом AspectJ (compile/load-time weaving)