В каких случаях аннотация @Transactional в Spring не будет применена?

«В каких случаях аннотация @Transactional в Spring не будет применена?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотация @Transactional не будет применена (транзакция не откроется) в следующих сценариях:

  1. Метод имеет модификатор private, final или static. Spring AOP не может создать прокси для таких методов.

  2. Self-invocation (внутренний вызов). Вызов @Transactional-метода из другого метода того же класса через this.

    @Service
    public class UserService {
        public void updateUser() {
            // Прямой вызов -> транзакция НЕ создастся
            this.saveAuditLog();
        }
        @Transactional
        public void saveAuditLog() { /* ... */ }
    }

    Решение: Внедрить сам бин или использовать AspectJ mode.

  3. Метод не вызывается через Spring-прокси. Например, вызов через new оператор или если бин создан вне контекста Spring.

  4. Отсутствует конфигурация управления транзакциями. В конфигурации приложения должен быть включен @EnableTransactionManagement (в Spring Boot это по умолчанию).

  5. Используется неправильный TransactionManager. Например, для JPA должен быть бин типа JpaTransactionManager.

  6. Исключение возникает до открытия транзакции. Например, ошибка валидации параметров метода до входа в прокси-метод.