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

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

作者: 川流不息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;
            }
        }
    }        

相关文章

  • Java基础学习(四)- 方法

    方法 概述为了解决代码重复调用的问题,可以将一个重复的代码块封装到一个{}括号里面,并且为这个代码块起个名字,这个...

  • CSS实现居中样式

    水平居中 行内元素水平居中 方法:用text-align:center实现 html代码部分 css代码部分 块元...

  • 成员变量初始化

    class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通...

  • 线程 — wait()方法

    wait()方法 wait()方法必须在synchronized同步代码块里面,因为wait()作用就是释放同步锁...

  • AopContext.currentProxy()解决同类中调用

    如上代码,在同一个类中,非事务方法A调用事务方法B,会导致事务失效,可以采用AopContext.currentP...

  • 如何理解Java中的final、static、final sta

    在Java中这几个关键字常常被混用。 可修饰部分 static:成员变量、方法、代码块(静态代码块)、内部类(静态...

  • Java代码块的执行顺序

    执行顺序首先执行静态代码块接着执行构造代码块最后指向构造方法 静态代码块 >>> 构造代码块 >>>> 构造方法 ...

  • 关于构造代码块、静态代码块和构造函数执行顺序

    普通代码块: 普通方法的方法体 构造代码块: 用{}包裹的代码 静态代码块: 用static{}包裹的代码 运行结...

  • 浅入浅出的代理模式与Spring事务管理

    前言 最近在开发业务代码的时候,犯了一个事务注解的错误:在同一个类的非事务方法中调用了另一个事务方法,导致事务没有...

  • Java并发编程实践

    内部锁 synchronized块有两个部分:锁对象的引用以及保护的代码块。方法的锁是方法所在的对象本身,静态方法...

网友评论

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

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