CompletableFuture事物回滚的问题 本地事物和feign调用的回滚

1 篇文章 0 订阅
1 篇文章 0 订阅

缺点:
1.这种方式局限性很大 但是也支持某些场景
2.原子性不能得到完全一致性的保证 但是一般能正常回滚
3 需要try catch 每次需要手动提交
4.feign调用也需要重复操作
优点:
1.可以解决异步中的回滚事物 (但是不能回滚主线程中的事物)
2.分布式事物对异步中的增删改没有效果 利用本地事物进行异常捕获来提交异常 利用Redis来保证事物是否进行回滚

1.A

 @Autowired
    private TransactionDefinition transactionDefinition;
    @Autowired
    private OrdReportBusinessService orderReportBusinessService;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private FoodOrderInfoApi foodOrderInfoApi;
    @GetMapping("/test")
    public Result test() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            CompletableFuture.runAsync(() ->{
                // 每一个线程都来共享之前的请求数据
                RequestContextHolder.setRequestAttributes(requestAttributes);
                TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
                try{
                    //本地保存
                    boolean save1 = orderReportBusinessService.save(new OrdReportBusinessEntity().setOrderId(111L));
//                    int i = 1/0;
                    if(save1){
                    //feign调用保存
                        OrdOrderInfoEntity save2 = foodOrderInfoApi.saves(new OrdOrderInfoEntity().setOrderNo("2324594295"));
                        if(redisUtil.get("rollback").equals(1)){
                            throw new Exception("异常回滚");
                        }
                        if(Objects.equals(null,save2.getOrderNo())){
                            throw new Exception("添加失败回滚");
                        }
                    }
                    platformTransactionManager.commit(transactionStatus);
                }catch (Exception e){
                    e.printStackTrace();
                    platformTransactionManager.rollback(transactionStatus);
                }
            },orderChangeThreadPoolExecutor);

        return  Result.OK();
    }

2.B

@Autowired
    private PlatformTransactionManager platformTransactionManager;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private TransactionDefinition transactionDefinition;
    @PostMapping("/saves")
    OrdOrderInfoEntity saves(@RequestBody OrdOrderInfoEntity entity) throws Exception {
        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
        try {
            OrdOrderInfoEntity ordOrderInfoEntity = foodMerchantOrderInfoService.saveEntity(entity);
            //int i = 1/0;
            redisUtil.set("rollback",0);
            platformTransactionManager.commit(transactionStatus);
            return ordOrderInfoEntity;
        } catch (Exception e) {
            redisUtil.set("rollback",1);
            platformTransactionManager.rollback(transactionStatus);
            throw new Exception("异常");
        }
    }

对于不能回滚主线程事物 可以采用
1.主线程数据保存失败则不走异步
2.主线程数据保存成功,异步中的事物出现了异常的话则根据主线程中保存成功的ID在异步中删除主线程中的数据并且回滚异步中的事物

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值