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

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

Ответ

Для корректной работы декларативного управления транзакциями через @Transactional в Spring необходимо выполнить несколько условий:

1. Конфигурация:

  • Включить управление транзакциями с помощью аннотации @EnableTransactionManagement в классе конфигурации (в Spring Boot это делается автоматически).
  • Настроить менеджер транзакций (например, PlatformTransactionManager). В Spring Boot с JPA достаточно зависимости spring-boot-starter-data-jpa, и JpaTransactionManager создается автоматически.

2. Правильное объявление:

  • Аннотацию @Transactional можно ставить на класс (все public методы становятся транзакционными) или на отдельный public-метод.
  • Метод должен быть public. Вызов @Transactional-метода изнутри того же класса (self-invocation) не будет работать через AOP-прокси.

Пример минимальной конфигурации в Spring Boot:

@Service
public class UserService {

    @Transactional // Транзакция начнется при входе в метод
    public void updateUser(User user) {
        // Работа с EntityManager или JpaRepository
        // При успешном завершении — коммит, при исключении RuntimeException — откат
    }
}

3. Механизм работы: Spring создает AOP-прокси вокруг бина. При вызове транзакционного метода прокси:

  • Получает соединение/сессию из пула.
  • Отключает auto-commit.
  • Выполняет целевой метод.
  • При успехе — коммитит транзакцию.
  • При возникновении unchecked исключения (RuntimeException и его наследники) — откатывает транзакцию. Для checked исключений откат не происходит по умолчанию (можно настроить через rollbackFor).

Ключевые атрибуты для настройки: propagation, isolation, timeout, readOnly, rollbackFor/noRollbackFor.