1. 程式人生 > >AOP實現LCN分散式事務手動回滾

AOP實現LCN分散式事務手動回滾

  由於專案用了較為完善的異常處理機制,導致微服務在丟擲異常時,立即被@ExpectionHandler捕捉掉了,造成LCN分散式事務無法捕捉到異常而無法回滾的情況。在檢視LCN原理的時候,偶然發現可以獲取LCN管理事務的事務組代號groupId,由此想到能不能通過這個ID來手動回滾達到目的。

  原理

   1.在被呼叫服務異常丟擲後,ExceptionHandler進行捕捉並會返回這些錯誤資訊給被服務呼叫者,如果微服務呼叫成功,資訊中錯誤碼等於10000,如果不成功,那麼錯誤碼是不會等於10000的。那麼在服務呼叫者將這些資訊return之後,可以用aop來判斷資訊是否等於10000,如果不等於,拿到事務組groupId進行手動回滾。

  2.如果獲取LCN的groupId?LCN原始碼裡有一個

MQTxManagerService

直接注入它:

  @Autowired
  MQTxManagerService mqTxManagerService;

  然後TxTransactionLocal.current().getGroupId()拿到groupId,向tx-manager傳送關閉事務的請求。

 @AfterReturning(value = "firstPointCut()",returning = "result")
    public void rollback(JoinPoint joinPoint, Object result){
        if(result instanceof BizRespDto){
            BizRespDto bizRespDto = (BizRespDto) result;

            if(bizRespDto.getCode() != 10000){
                logger.info("過程出現異常,分散式事務開始手動回滾");
                int res
  = mqTxManagerService.closeTransactionGroup(TxTransactionLocal.current().getGroupId(),0);
                logger.info("分散式事務手動回滾結束");
                if(res == 0){
                    logger.info("手動關閉事務組的返回響應:{},沒有正常通知執行",res);
                }else{
                    logger.info("手動關閉事務組的返回響應:{},正常通知執行",res);
                }
            }
        }
    }