許多用LCN作為分布式事務解決方案的同學可能會遇到一個問題。當分布式事務中的子事務自己try catch了異常的時候,異常並沒有拋出來,而不拋出異常,則LCN不會執行回滾操作
這種情況其實挺常見的,比如:一個訂單系統,在下單的時候可能會涉及到優惠券、積分、權益的使用,而如果優惠券、積分、權益分別由不同開發人員開發,他們各自有自己的開發習慣,其中一個人就習慣自己處理異常,然后返回一個錯誤碼,又或者有些公司的代碼規則是需要自己處理異常的。這種情況,就不能依靠異常來讓LCN回滾事務。
那這時候怎么辦呢?
其實LCN已經給出了手動回滾的接口。而我們要做的其實就是在合適的時機調用這個接口,Spring給我們提供了一個非常好的時機,AOP。
下面直接貼代碼了:
@Aspect @Component public class TxAspect { private static final Logger logger = LoggerFactory.getLogger(TxAspect.class); @Autowired MQTxManagerService mqTxManagerService; @Pointcut("@annotation(com.codingapi.tx.annotation.TxTransaction)") //只需攔截使用了LCN注解的方法 public void txAnnotation(){ } @AfterReturning(returning = "ret", pointcut = "txAnnotation()") public void doAfterReturning(JoinPoint joinPoint,Object ret) { ResultBeans resultBeans = (ResultBeans)ret; //獲取到方法的返回值,相信大家同一個項目的方法的返回值類型應該能統一 if (resultBeans.getCode()!=1001){ //定義成功的code,根據這個code來判斷需不需要回滾 logger.info("LCN手動回滾事務"); int res = mqTxManagerService.cleanNotifyTransaction(TxTransactionLocal.current().getGroupId(),TxTransactionLocal.current().getKid()); //調用LCN的接口實現事務回滾 } } }
這里插一句,之前本人也搜過博客,有博客上使用的回滾方法是mqTxManagerService.closeTransactionGroup(),但在我的項目中使用這個方法無法回滾,目前沒找到原因
補充:
以上是LCN4.0版本的解決方案,LCN5.0之后的api有較大改動,LCN5.0更新之后功能強大了許多
附上5.0手動回滾事務的解決方案:
//int res = mqTxManagerService.notifyGroup(TxContext.current().getGroupId(),TxTransactionLocal.current().getKid());
DTXUserControls.rollbackCurrentGroup(); //只需換一下回滾API就可以了
沒有英漢互譯結果
請嘗試網頁搜索
請嘗試網頁搜索
沒有英漢互譯結果
請嘗試網頁搜索
請嘗試網頁搜索