最近,我一直在使用Spring Boot + Spring Data JPA + Hibernate。我在春季交易中遇到了一个问题。这是我的服务班级和两个问题:
@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()
将回滚的事务,并且循环将连续进行。感谢大家的回应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句