AOP實現LCN分散式事務手動回滾
阿新 • • 發佈:2019-02-03
由於專案用了較為完善的異常處理機制,導致微服務在丟擲異常時,立即被@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); } } } }