美文网首页
一个方法里面部分代码块事务处理方式

一个方法里面部分代码块事务处理方式

作者: 川流不息attitude | 来源:发表于2023-06-26 17:21 被阅读0次

    一个方法里面部分代码块事务处理方式

    业务惨景,比如有时候我们在写业务的时候 一般写在service 方法里面,这个时候可能会碰到 你希望 部分业务带事务,部分不需要事务处理(如第3方 接口,通过定时任务什么的去补偿 )。

      public CheckOrderTO createOrder(CheckOrderDTO checkOrderDTO) {
            // 处理参数校验
            CheckOrderTO orderTO = new CheckOrderTO();
            orderTO.setSuccess(true);
            String errorMsg = checkParam(checkOrderDTO);
            if(StringUtils.isNotBlank(errorMsg)){
                orderTO.setMsg(errorMsg);
                orderTO.setSuccess(false);
                return orderTO;
            }
            String channelCode = checkOrderDTO.getChannelCode();
            CheckOrderService checkOrderService = SpringUtil.getBean("checkOrderService");
            String orderSn = checkOrderService.createOrderDB(checkOrderDTO);
            orderTO.setOrderSn(orderSn);
            // 发送预约中消息
            sendOrderMsg(checkOrderDTO, orderSn, CheckOrderStatusEnum.APPOINTMENT_IN_PROGRESS, CheckChannelOrderStatusEnum.APPOINTMENT_IN_PROGRESS);
            if (Objects.equals(SupportChannelEnum.MEI_NIAN.getValue(), channelCode)) {
                // 渠道创建成功
                try {
                    PostCreateDTO postCreateDTO = postCreateMeiNianOrder(checkOrderDTO, channelCode, orderSn);
                    //更新渠道号 订单状态
                    String serviceNumber = postCreateDTO.getServiceNumber();
                    checkOrderRepository.updateChannelOrderSnByOrderSn(orderSn, serviceNumber,CheckOrderStatusEnum.APPOINTMENT_SUCCESS,CheckChannelOrderStatusEnum.APPOINTMENT_SUCCESS);
                    // 发送成功消息
                    sendOrderMsg(checkOrderDTO, orderSn, CheckOrderStatusEnum.APPOINTMENT_SUCCESS, CheckChannelOrderStatusEnum.APPOINTMENT_SUCCESS);
                }catch (SupportException supportException){
                    // 渠道正常返回错误异常 不是超时
                    log.info("渠道校验异常 {}",supportException);
                    checkOrderRepository.updateChannelOrderSnByOrderSn(orderSn, "",CheckOrderStatusEnum.CANCELED,CheckChannelOrderStatusEnum.CANCEL_RESERVATION);
                    // 发送取消消息
                    sendOrderMsg(checkOrderDTO, orderSn, CheckOrderStatusEnum.CANCELED, CheckChannelOrderStatusEnum.CANCEL_RESERVATION);
                }catch (Exception e){
                    // 特殊异常 不做处理 可能连接超时导致 问题
                    log.error("其他异常",e);
                    throw e;
                }
    
            }
            
            
     @Transactional(rollbackFor = Exception.class)
        public String createOrderDB(CheckOrderDTO checkOrderDTO) {
            String oldOrderSn = getExistOrderSn(checkOrderDTO);
            if (oldOrderSn != null){
                return oldOrderSn;
            }
            try {
                String orderSn = checkOrderRepository.saveOrder(checkOrderDTO);
                return orderSn;
            }catch (DuplicateKeyException duplicateKeyException){
                log.info("重复调用创建订单 {}",duplicateKeyException);
                String existOrderSn = getExistOrderSn(checkOrderDTO);
                if (existOrderSn != null){
                    return existOrderSn;
                }else {
                    throw duplicateKeyException;
                }
            }
        }        
    

    相关文章

      网友评论

          本文标题:一个方法里面部分代码块事务处理方式

          本文链接:https://www.haomeiwen.com/subject/vocgydtx.html