AOP實現LCN手動回滾事務


許多用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就可以了

  沒有英漢互譯結果
   請嘗試網頁搜索
  沒有英漢互譯結果
   請嘗試網頁搜索


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM