为什么这个方法中@Transactional注解被忽略了?

问题描述 投票:0回答:1

我在尝试将 @Transactional 注释应用于同一类 (MyService) 中的方法 (methodC()) 时遇到了此问题。尽管使用了注释,但交易似乎并未按预期创建。

@Service
public class MyService {

  @Autowired
  private Service1 service1;

  @Autowired
  private Service2 service2;


  @Override
  public void methodA() {
    methodB();
  }

  private void methodB() {
    try{  
      methodC();
    }catch(MyException e){
      System.out.println(e);
    }catch(Exception e){
      System.out.println(e);
    }
  }

  @Transactional
  public void methodC() throws MyException, Exception{
    try{
      service1.someDeleteAndInserts();
      service2.someDeleteAndInserts();
    }catch(MyException e){
      throw e;
    }catch(Exception e){
      throw e;
    }
    
  }
}

正如我现在所拥有的,它为每个方法单独创建一个事务。我希望它只为该方法中调用的所有方法进行一笔事务。

@Transactional
  public void methodC() throws MyException, Exception{
    try{
      service1.someDeleteAndInserts();
      service2.someDeleteAndInserts();
    }catch(MyException e){
      throw e;
    }catch(Exception e){
      throw e;
    }
    
  }
java spring transactions spring-transactions rollback
1个回答
0
投票

您不能在同一服务中调用带注释的方法

@Transactional
。您只能从服务外部调用它,否则不会创建任何事务。每个 Spring 服务都是一个代理,并且事务(AOP)是在代理上创建的,因此一旦您输入任何方法,您就不再在代理中,因此没有 AOP(无事务):

例如,如果您有:

@Service
public class Service1 {

    @Transactional
    public void method1() { ... }

    public void method2() {
        method1();
    }
}

@Service
public class Service2 {

    @Autowired
    private Service1 service1;

    public void method1() {
        service1.method1();
    }

    public void method2() {
        service1.method2();
    }
}
  • 调用
    service2.method2()
    不会创建交易。
  • 调用
    service2.method1()
    将创建一个。

因为 Spring 处理代理和 AOP 的方式。

© www.soinside.com 2019 - 2024. All rights reserved.