Назад к вопросам
Senior
5
Как вызвать @Transactional метод внутри того же сервиса (self-invocation)?
Компании, где спрашивали
Octo
Ответ от нейросети
sobes.tech AI
Вызов @Transactional метода внутри того же сервиса (self-invocation) не будет работать, если просто вызвать метод напрямую, потому что Spring прокси не перехватывает вызовы внутри одного объекта.
Чтобы обойти это ограничение, можно:
-
Вынести @Transactional метод в отдельный сервис и вызывать его через бин Spring.
-
Внутри текущего сервиса получить прокси самого себя через ApplicationContext и вызвать метод через прокси:
@Service
public class MyService {
@Autowired
private ApplicationContext context;
public void outerMethod() {
// Получаем прокси самого себя
MyService proxy = context.getBean(MyService.class);
proxy.transactionalMethod();
}
@Transactional
public void transactionalMethod() {
// транзакционный код
}
}
- Использовать AspectJ вместо прокси, тогда self-invocation будет работать, но это требует дополнительной настройки.
Чаще всего рекомендуют первый вариант — разделить логику на два бина.