我正在使用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。我该怎么办?
答案 0 :(得分:1)
您不需要定义rollbackFor = {Throwable.class}
。
默认情况下,所有RuntimeException
在使用@Transactional
时都会回滚。
可能是因为您使用的是非@Transactional
注释的中间方法,所以主事务被挂起并创建了一个嵌套的事务。
尝试将@Transactional
放入您的public void generateInvoice()
中,然后将Propagation.REQUIRED
应用于您的发票回滚