我正在使用 Spring Data Rest 和 Spring JPA。我有一种方法可以更新一个数据库表。
@Autowired InvoiceClient;
@Override
@Transactional
public String doBilling(String x){
//get date from TableOne
Bill bill = billsRepository.getBill(x);
if(bill.isPaid()){
generateInvoice();
}
bill.setPaymentDate(new Date());
return "SUCCESS";
}
generateInvoice 是非事务方法,它从其他服务调用 @Transactional 方法。
public void generateInvoice(){
invoiceClient.generateInvoice();//this is @Transactional, make changes in TableTwo
}
如果generateInvoice方法出现任何异常,整个事务将回滚。 现在我想添加另一种方法,该方法将包含帐单号码列表。我循环调用 doBilling 方法来对所有账单进行计费。
@Override
@Transactional(readOnly = false, rollbackFor = {Throwable.class}, propagation = Propagation.REQUIRED)
public String doBillingForAll(List<String> tx){
for(String x: tx){
doBilling(x);
}
}
但是现在,如果 doBilling 方法出现任何异常,所有 setPayment 方法都会回滚,但generateInvoice 会保留。 我也想回滚generateInvoice。我该怎么做?
最佳答案
您不需要定义 rollbackFor = {Throwable.class}
。
默认全部RuntimeException
使用@Transactional
时进行回滚.
这可能是因为您正在使用中间非 @Transactional
注解方法,主事务被挂起并创建一个嵌套事务。
尝试输入 @Transactional
在你的public void generateInvoice()
然后Propagation.REQUIRED
应与发票回滚一起应用
关于java - 如何在相同和不同的服务中调用 @Transactional 和非事务方法时回滚事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52554520/