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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值