Сколько транзакций создается, если метод с аннотацией @Transactional вызывает другой @Transactional метод в Spring?

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

Ответ

Поведение зависит от propagation (распространения) транзакции. По умолчанию (Propagation.REQUIRED) будет использована одна физическая транзакция.

Ключевые моменты:

  • Propagation.REQUIRED (по умолчанию): Внутренний метод присоединяется к существующей транзакции внешнего метода. Создается одна транзакция.
  • Propagation.REQUIRES_NEW: Внутренний метод всегда запускает новую, независимую транзакцию. Внешняя транзакция приостанавливается. Создаются две транзакции.
  • Propagation.NESTED: Внутри внешней транзакции создается вложенная точка сохранения (savepoint). Откат внутреннего метода не приводит к откату всей внешней транзакции (если не используется REQUIRES_NEW).

Пример с REQUIRED (по умолчанию):

@Service
public class MyService {
    @Transactional // Начинает транзакцию T1
    public void outerMethod() {
        // Логика в T1
        innerMethod(); // Присоединяется к T1
        // Логика в T1
    } // T1 коммитится или откатывается здесь

    @Transactional(propagation = Propagation.REQUIRED) // Тот же параметр по умолчанию
    public void innerMethod() {
        // Логика в той же транзакции T1
    }
}

Итог: Будет создана одна транзакция.