[英]How to rollback transaction on calling @Transactional and non-Transactional method in same and different Service?
我正在使用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}
。 默認情況下,使用@Transactional
時,所有RuntimeException
都會回滾。
可能是因為您使用的是非@Transactional
注釋的中間方法,所以主事務被掛起並創建了一個嵌套的事務。
嘗試將@Transactional
放入您的public void generateInvoice()
然后將Propagation.REQUIRED
與您的發票回滾一起應用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.