1. 程式人生 > >redis實現跨系統操作時的一致性事務

redis實現跨系統操作時的一致性事務

經常會遇到一種情況,就是方法中會呼叫本系統的方法做一些操作,然後同時再呼叫外系統方法做一些操作,當本系統方法執行成功,而外部系統方法執行失敗的時候,往往會需要回滾或者進行補償操作,這裡我們可以用redis實現這一需求。

        //更新資料庫, 操作之前先記redis
        String seckillCheckedListKey = "secKillCheckedList";
        String valKey = applyWare.getId() + "_" + DateUtil.formatDateTime(new Date());
        this.redisClient.sadd(seckillCheckedListKey, valKey);
        boolean success = checkFlowOperate.checkApply(checkApplyParam);  ①
        LogTypeEnum.ROUTINE_CHECK_RECOMMEND.warn("checkupdate applyWareId={} db success={}", applyWare.getId(), success);
        if (!success) {
            result.setResultCode("稽核通過操作失敗,請稍後重試!");
            return result;
        }
        //重新索引,建立促銷
        LogTypeEnum.ROUTINE_CHECK_RECOMMEND.warn("checkupdate applyWareId={} solr begin", applyWare.getId());
        BaseParam baseParam = checkFlowOperate.indexMQOpt(OperateType.ADD,checkApplyParam, pageView.getRoleType()); ②
        LogTypeEnum.ROUTINE_CHECK_RECOMMEND.warn("checkupdate applyWareId={} solr finish", applyWare.getId());
        

        redisClient.srem(seckillCheckedListKey, valKey);//操作成功刪除redis中的稽核標識

這裡 ① 為本地對資料庫的操作,②為刷solr和推MQ的操作,有可能①成功而②失敗,這樣需要記錄下這類情況,然後進行處理,所以這裡會剛開始的時候會存入到redis中,然後執行完①②後再把redis中的這條資料給去掉,這樣可以用一個定時器去跑,然後從redis中取得有問題的資料後迴圈執行,補刷solr和發MQ,然後再從redis中去掉。