Ответ
Аннотация @Transactional не будет применена (транзакция не откроется) в следующих сценариях:
-
Метод имеет модификатор
private,finalилиstatic. Spring AOP не может создать прокси для таких методов. -
Self-invocation (внутренний вызов). Вызов
@Transactional-метода из другого метода того же класса черезthis.@Service public class UserService { public void updateUser() { // Прямой вызов -> транзакция НЕ создастся this.saveAuditLog(); } @Transactional public void saveAuditLog() { /* ... */ } }Решение: Внедрить сам бин или использовать
AspectJmode. -
Метод не вызывается через Spring-прокси. Например, вызов через
newоператор или если бин создан вне контекста Spring. -
Отсутствует конфигурация управления транзакциями. В конфигурации приложения должен быть включен
@EnableTransactionManagement(в Spring Boot это по умолчанию). -
Используется неправильный
TransactionManager. Например, для JPA должен быть бин типаJpaTransactionManager. -
Исключение возникает до открытия транзакции. Например, ошибка валидации параметров метода до входа в прокси-метод.