調用rpc dubbo接口,事務的回滾無效

需求:循環(數據量不大,最多預計是20多條數據),不計劃批量插入。

如果其中一條數據發生插入異常,則本次執行插入的數據,要全部回滾。

流程:for()循環裏,rpc調用另一個系統的接口(該接口是插入數據)。

 @Transactional(rollbackFor = {Exception.class, RuntimeException.class})

for(){

//rpc,dubbo接口調用另一個系統的insert數據接口。

}

結果:數據2異常後,數據1是插入成功的。

原由:這裏涉及到一個分佈式事務的概念 : 聊分佈式事務,再說說解決方案

調用rpc是不會回滾的

解決方案:

1,把for循環寫進rpc接口裏。回滾rpc的接口方法。

2,@Transactional(rollbackFor = {Exception.class, RuntimeException.class}) 

在rpc接口裏,加上此事務註解。但實際上也並沒有回滾。

最後採用手動回滾方式:

try {

for(){

   insert();

}

} catch (Exception e) {
      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      logger.error("插入失敗:{}", e);
      throw e;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章