捕获异常的 Spring 事务

pol*_*lis 1 java spring hibernate jpa spring-data

最近一直在用Spring boot + spring data jpa + hibernate。我在 spring 事务中遇到了一个问题。这是我的服务类和两个问题:

@Transactional
@Service
class MyService {

    @Autowired
    private MyRepository myRep;

    public void method_A() {
       try {
          method_C();

          .....

          method_B();
       } catch(Exception e) {}
    }

    public void method_B() {
       Entity e = new Entity();
       e.set(...);

       myRep.save(e);
    }

    public void method_C() throws Exception {
       ....
    }
}
Run Code Online (Sandbox Code Playgroud)

1.如果方法method_C()抛出异常,我想捕获它并记录它,事务不会在方法中回滚method_B(),因为异常没有到达Spring框架。那么我应该怎么做才能捕获异常method_C()并同时不失去method_B()回滚方法的能力?

2.考虑新方法method_A()

public void method_A() {
   for(...) {
      ...
      ...
      method_B();
   }
}
Run Code Online (Sandbox Code Playgroud)

我想method_B()在循环中调用。如果在method_B()我希望事务method_B()被回滚但method_A()不应退出并且循环应继续执行中发生异常。我怎样才能做到这一点?

pol*_*lis 6

我以这种方式解决了我的两个问题:创建了另一个@Service类并method_B()进入了它。我已经将这个类注释为@Transactional. 现在该方法method_A()如下所示:

public void method_A() {
   for(...) {
      ...
      try {
         anotherService.method_B();
      } catch (Exception e) {
         logger.error(...);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

如果RuntimeException发生在method_B()方法中,异常被正确记录,事务method_B()被回滚并且循环继续。谢谢大家的回复。