Назад к вопросам
Senior
6
Как можно создать две транзакции в одном классе (обойти ограничение self-invocation)?
Компании, где спрашивали
EXPERA
Ответ от нейросети
sobes.tech AI
В Java, при использовании Spring и аннотации @Transactional, проблема self-invocation возникает из-за того, что вызов метода с транзакцией внутри того же класса не проходит через прокси, и аннотация не срабатывает.
Чтобы создать две отдельные транзакции в одном классе и обойти это ограничение, можно:
-
Вынести методы с разными транзакциями в отдельный сервис и вызывать их через внедренный бин (через прокси).
-
Использовать 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();
}
}
- Использовать AspectJ вместо прокси, тогда self-invocation будет работать корректно.
Таким образом, ключ — вызывать методы с транзакциями через прокси, а не напрямую внутри того же класса.