Назад к вопросам
Middle
108
questionbank
Что произойдет, если в методе вызвать метод, помеченный аннотацией @Transactional?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Если из метода внутри того же объекта (Self-Invocation) вызвать метод, помеченный @Transactional, транзакция не будет создана или присоединена к существующей. Это происходит потому, что Spring AOP по умолчанию использует прокси-объекты для применения аспектов, включая транзакции. При вызове метода внутри того же объекта, вызов идет непосредственно к реальному объекту (this), минуя прокси.
Чтобы транзакция применялась в этом случае, можно использовать:
- Инжекция self-bean:
// Предполагается, что класс Foo - бин Spring @Service public class Foo { @Autowired private Foo self; // Инжектируем прокси-объект public void outerMethod() { // Вызываем метод test() на прокси-объекте self.test(); } @Transactional public void test() { // Этот метод будет выполняться в транзакции } } AopContext.currentProxy():// Предполагается, что класс Foo - бин Spring @Service public class Foo { public void outerMethod() { // Вызываем метод test() на прокси-объекте через AopContext ((Foo) AopContext.currentProxy()).test(); } @Transactional public void test() { // Этот метод будет выполняться в транзакции } }
Если метод с @Transactional вызывается из другого Spring-бина, транзакция будет создана или присоеднинена к существующей, поскольку вызов пройдет через прокси-объект.