关闭订单考虑并发访问情况

一、问题引出

如果关闭订单时如下代码实现的,会引发什么问题?

    public void closeOrder(Long orderId, Long userId) {

//        int a = 1 / 0 ;

        // 根据订单的id查询订单
        LambdaQueryWrapper<OrderInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>() ;
        lambdaQueryWrapper.eq(OrderInfo::getId , orderId) ;
        lambdaQueryWrapper.eq(OrderInfo::getUserId , userId) ;
        OrderInfo orderInfo = this.getOne(lambdaQueryWrapper);

        // 判断订单的状态是否为未支付
        if(OrderStatus.UNPAID.name().equals(orderInfo.getOrderStatus()) && ProcessStatus.UNPAID.name().equals(orderInfo.getProcessStatus())) {

            // 将订单的状态更改为已关闭
            // update order_info set order_status = 'CLOSE' , process_status = 'CLOSE' where id = ?  and user_id = ? 
            orderInfo.setOrderStatus(OrderStatus.CLOSED.name());
            orderInfo.setProcessStatus(ProcessStatus.CLOSED.name());
            this.update(orderInfo , lambdaQueryWrapper) ;

        }

    }

      1.订单在支付成功后,将订单状态改正已支付

      2.订单超时未支付,将订单状态改为关闭状态

情况一:当订单在支付时,且关闭订单操作进入查询订单操作,然后订单完成支付并且状态更改时,此时判断订单状态是否支付的条件不会成立,这种情况不需要做操作。

情况二:当关闭订单操作并且进入到判断订单状态的提交成立时,此时成功支付,订单状态更改成已支付,然后订单又被更改成已关闭.

情况二的解决方案:1.悲观锁:jdk、分布式锁  

                                2.乐观锁:cas算法

乐观锁原理:cas算法,version版本号

 

二、解决方案

在进行订单关闭的时候添加上订单未支付的条件
    public void closeOrder(Long orderId, Long userId) {

//        int a = 1 / 0 ;

        // 根据订单的id查询订单
        LambdaQueryWrapper<OrderInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>() ;
        lambdaQueryWrapper.eq(OrderInfo::getId , orderId) ;
        lambdaQueryWrapper.eq(OrderInfo::getUserId , userId) ;
        OrderInfo orderInfo = this.getOne(lambdaQueryWrapper);

        // 判断订单的状态是否为未支付
        if(OrderStatus.UNPAID.name().equals(orderInfo.getOrderStatus()) && ProcessStatus.UNPAID.name().equals(orderInfo.getProcessStatus())) {

            // 将订单的状态更改为已关闭
            // update order_info set order_status = 'CLOSE' , process_status = 'CLOSE' where id = ?  and user_id = ? and order_status = 'UNPAID' and process_status = 'UNPAID'
            orderInfo.setOrderStatus(OrderStatus.CLOSED.name());
            orderInfo.setProcessStatus(ProcessStatus.CLOSED.name());
            lambdaQueryWrapper.eq(OrderInfo::getOrderStatus , OrderStatus.UNPAID.name()) ;
            lambdaQueryWrapper.eq(OrderInfo::getProcessStatus , ProcessStatus.UNPAID.name());
            this.update(orderInfo , lambdaQueryWrapper) ;

        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值