Какой режим управления транзакциями используется в Spring по умолчанию?

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

Ответ

В Spring Framework по умолчанию используется режим PROPAGATION_REQUIRED.

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

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

Практический пример:

@Service
public class BankService {

    @Transactional // Используется PROPAGATION_REQUIRED по умолчанию.
    public void transferMoney(Account from, Account to, BigDecimal amount) {
        // 1. Здесь создается НОВАЯ транзакция, т.к. вызов идет извне.
        withdraw(from, amount);
        deposit(to, amount);
    }

    @Transactional
    public void withdraw(Account account, BigDecimal amount) {
        // 2. Этот метод НЕ создает новую транзакцию,
        // а присоединяется к существующей из transferMoney().
        account.setBalance(account.getBalance().subtract(amount));
        accountRepository.save(account);
    }
}

Важно: Это поведение по умолчанию для аннотации @Transactional. Его можно изменить, явно указав другой propagation, например @Transactional(propagation = Propagation.REQUIRES_NEW).