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



我正在使用 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应与发票回滚一起应用

相关内容

最新更新