Sobes.tech
Back to questions
Senior
6

Как вызвать @Transactional метод внутри того же сервиса (self-invocation)?

Companies where asked
Octo

Answer from AI

sobes.tech AI

Вызов @Transactional метода внутри того же сервиса (self-invocation) не будет работать, если просто вызвать метод напрямую, потому что Spring прокси не перехватывает вызовы внутри одного объекта.

Чтобы обойти это ограничение, можно:

  1. Вынести @Transactional метод в отдельный сервис и вызывать его через бин Spring.

  2. Внутри текущего сервиса получить прокси самого себя через ApplicationContext и вызвать метод через прокси:

@Service
public class MyService {

    @Autowired
    private ApplicationContext context;

    public void outerMethod() {
        // Получаем прокси самого себя
        MyService proxy = context.getBean(MyService.class);
        proxy.transactionalMethod();
    }

    @Transactional
    public void transactionalMethod() {
        // транзакционный код
    }
}
  1. Использовать AspectJ вместо прокси, тогда self-invocation будет работать, но это требует дополнительной настройки.

Чаще всего рекомендуют первый вариант — разделить логику на два бина.