Ответ
В 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).