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

Задача по коду: Spring @Transactional и self-invocation (скриншот с кодом)

Компании, где спрашивали
Позитив Технолоджис

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

sobes.tech AI

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

Это происходит потому, что вызов идет не через прокси, а напрямую по this, и Spring не может применить транзакционный аспект.

Чтобы обойти эту проблему, можно:

  • Вынести транзакционный метод в отдельный бин и вызывать его через внедренный сервис.
  • Использовать AopContext.currentProxy() для получения прокси и вызова метода через него.

Пример:

@Service
public class MyService {

    @Transactional
    public void transactionalMethod() {
        // код в транзакции
    }

    public void caller() {
        ((MyService) AopContext.currentProxy()).transactionalMethod();
    }
}

И не забыть включить exposeProxy = true в конфигурации Spring.