Каково поведение метода, аннотированного @Transactional(propagation = Propagation.NEVER), в Spring?

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

Ответ

Метод с Propagation.NEVER должен выполняться без транзакции. Если он вызывается в существующем транзакционном контексте, Spring выбрасывает IllegalTransactionStateException.

Пример и отличие:

@Service
public class Service {

    @Transactional
    public void transactionalMethod() {
        neverMethod(); // ИСКЛЮЧЕНИЕ: IllegalTransactionStateException
    }

    @Transactional(propagation = Propagation.NEVER)
    public void neverMethod() {
        // Требует отсутствия активной транзакции
    }

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void notSupportedMethod() {
        // Будет выполнена БЕЗ транзакции, даже если она есть (она приостанавливается)
    }
}

Когда использовать:

  • Для методов, которые никогда не должны выполняться в транзакции (например, логирование, вызов внешних API).
  • Как защитный механизм для гарантии отсутствия транзакции.