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中去掉。

猜你喜欢

转载自zy116494718.iteye.com/blog/2377570