如何在相同和不同服务中调用@Transactional和non-Transactional方法时回滚事务?

时间:2018-09-28 11:37:45

标签: java spring spring-data-jpa spring-data-rest distributed-transactions

我正在使用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。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您不需要定义rollbackFor = {Throwable.class}。 默认情况下,所有RuntimeException在使用@Transactional时都会回滚。

可能是因为您使用的是非@Transactional注释的中间方法,所以主事务被挂起并创建了一个嵌套的事务。

尝试将@Transactional放入您的public void generateInvoice()中,然后将Propagation.REQUIRED应用于您的发票回滚