最近一直在使用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 {
....
}
}
1.如果方法 method_C()
抛出异常,我想捕获它并记录它,事务不会在方法 method_B()
中回滚,因为异常未到达 Spring 框架。那么我应该怎么做才能捕获 method_C()
的异常,同时又不失去回滚方法 method_B()
的能力?
2.考虑新方法method_A()
。
public void method_A() {
for(...) {
...
...
method_B();
}
}
我想在循环中调用 method_B()
。如果在 method_B()
中发生异常,我希望 method_B()
的事务被回滚,但是 method_A()
不应退出并且循环应该继续执行。我怎样才能做到这一点?
最佳答案
我通过这种方式解决了我的 2 个问题:创建了另一个 @Service
类并将 method_B()
移入其中。我已将此类注释为 @Transactional
。现在方法 method_A()
看起来像这样:
public void method_A() {
for(...) {
...
try {
anotherService.method_B();
} catch (Exception e) {
logger.error(...);
}
}
}
如果RuntimeException
发生在method_B()
方法中,异常会被正确记录,method_B()
的事务被回滚并且循环连续的。感谢大家的回复。
关于java - 捕获异常的 Spring 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712581/