Ответ
Нет, транзакция не создастся из-за ограничения механизма AOP в Spring.
Причина: Управление транзакциями реализовано через прокси-объекты. Вызов метода внутри того же класса (this.innerMethod()) обходит прокси, и аннотация @Transactional игнорируется.
Проблемный сценарий (самовызов):
@Service
public class MyService {
// Вызывается клиентом -> работает через прокси
public void outer() {
inner(); // Самовызов! Прокси не участвует -> НЕТ ТРАНЗАКЦИИ
}
@Transactional // Аннотация не сработает
public void inner() {
// Операции с БД не будут защищены транзакцией
}
}
Решение:
-
Инъекция самого себя (через
@Autowired):@Service public class MyService { @Autowired private MyService self; // Ссылка на прокси public void outer() { self.inner(); // Вызов через прокси -> транзакция создается } @Transactional public void inner() { ... } } - Вынос в отдельный бин.
- Использование
TransactionTemplateдля программного управления.
Важно: Если вызов идет между разными бинами, транзакция создается корректно, так как вызов проходит через прокси.