簡體   English   中英

如何在相同和不同服務中調用@Transactional和non-Transactional方法時回滾事務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM