Ответ
Поведение зависит от 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
}
}
Итог: Будет создана одна транзакция.