我正在使用 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";
}
生成发票是非事务方法,它从其他服务调用@Transactional方法。
public void generateInvoice(){
invoiceClient.generateInvoice();//this is @Transactional, make changes in TableTwo
}
如果生成发票方法中出现任何异常,则会回滚整个事务。 现在我想再添加一个方法,它将具有账单编号列表。我在循环中调用doBill方法对所有账单进行计费。
@Override
@Transactional(readOnly = false, rollbackFor = {Throwable.class}, propagation = Propagation.REQUIRED)
public String doBillingForAll(List<String> tx){
for(String x: tx){
doBilling(x);
}
}
但是现在,如果doBill方法出现任何异常,所有setPay方法都会回滚,但会保留生成发票。 我也想回滚生成发票。我该怎么做?
您不需要定义rollbackFor = {Throwable.class}
。 默认情况下,所有RuntimeException
在使用@Transactional
时都会执行回滚。
可能是因为您使用的是中间非@Transactional
注释方法,主事务被挂起并创建一个嵌套事务。
尝试将@Transactional
放入您的public void generateInvoice()
然后Propagation.REQUIRED
应与发票回滚一起应用