Какое значение propagation по умолчанию у аннотации @Transactional в Spring?

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

Ответ

По умолчанию используется Propagation.REQUIRED.

Что это означает:

  • Если транзакция уже существует, метод будет выполняться в её контексте.
  • Если активной транзакции нет, будет создана новая.

Пример явного указания (избыточного, так как это значение по умолчанию):

@Transactional(propagation = Propagation.REQUIRED)
public void processOrder(Order order) {
    // ...
}

Другие варианты распространения (Propagation):

  • REQUIRES_NEW – Всегда создает новую транзакцию, приостанавливая существующую.
  • SUPPORTS – Выполняется в транзакции, если она есть, и без неё, если нет.
  • MANDATORY – Требует наличия активной транзакции, иначе выбрасывается исключение.
  • NOT_SUPPORTED – Всегда выполняется без транзакции, приостанавливая существующую.
  • NEVER – Запрещает наличие транзакции, иначе выбрасывается исключение.
  • NESTED – Создает вложенную транзакцию, если она существует (работает с точками сохранения Savepoint).