Ответ
Транзакция не будет создана. Это происходит из-за ограничения Spring AOP: прокси-объект перехватывает только внешние вызовы, а внутренние вызовы внутри одного класса обходят проксирование.
Пример проблемы:
@Service
public class UserService {
public void nonTransactionalMethod() {
// Внутренний вызов - транзакция НЕ создается
transactionalMethod();
}
@Transactional
public void transactionalMethod() {
// Операции с БД без транзакционной защиты
}
}
Решения:
-
Вынести в отдельный сервис (рекомендуется):
@Service class TransactionalService { @Transactional public void transactionalMethod() { /* ... */ } } -
Использовать self-injection (осторожно):
@Autowired private UserService self;
public void nonTransactionalMethod() { self.transactionalMethod(); // Теперь работает через прокси }
3. **Программное управление через TransactionTemplate:**
```java
@Autowired
private TransactionTemplate transactionTemplate;
public void nonTransactionalMethod() {
transactionTemplate.execute(status -> {
// транзакционный код
return null;
});
}
- Использовать AspectJ mode (менее распространено):
spring.aop.proxy-target-class=false