需求:循環(數據量不大,最多預計是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;
}