Sobes.tech
Назад к вопросам
Senior
5

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

Компании, где спрашивали
Octo

Ответ от нейросети

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 будет работать, но это требует дополнительной настройки.

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