Назад к вопросам
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-бина, транзакция будет создана или присоеднинена к существующей, поскольку вызов пройдет через прокси-объект.