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

Как можно создать две транзакции в одном классе (обойти ограничение self-invocation)?

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

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

sobes.tech AI

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

Чтобы создать две отдельные транзакции в одном классе и обойти это ограничение, можно:

  1. Вынести методы с разными транзакциями в отдельный сервис и вызывать их через внедренный бин (через прокси).

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

@Service
public class MyService {

    @Autowired
    private ApplicationContext context;

    @Transactional(propagation = Propagation.REQUIRED)
    public void method1() {
        // ...
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void method2() {
        // ...
    }

    public void caller() {
        context.getBean(MyService.class).method1();
        context.getBean(MyService.class).method2();
    }
}
  1. Использовать AspectJ вместо прокси, тогда self-invocation будет работать корректно.

Таким образом, ключ — вызывать методы с транзакциями через прокси, а не напрямую внутри того же класса.