请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关闭订单的行锁问题

这里只对商品表加了锁,为什么不对订单表或者订单详情表的那些记录也加锁呢。我理解的是,商品表加锁是必须的,因为要对库存做更新,而对订单表则是把状态改成了无效订单,订单详情表本身无任何变化,所以只是业务上,没必要去对订单表加锁,是这个意思么?如果纯粹从逻辑上来讲,是不是也需要呢?

脑子有点乱,我就想定时任务在执行的时候,要是恰好这个用户去修改了订单的状态,那会不会数据不安全的问题,麻烦老师帮忙讲解下

正在回答 回答被采纳积分+3

1回答

geelylucky 2020-06-15 08:53:25

同学,所以在修改订单状态的时候需要加条件判断,比如set state=? where state=?,不满足条件就不会修改成功

0 回复 有任何疑惑可以回复我~
  • 提问者 慕哥6062902 #1
    public void closeOrder(int hour) {
            Date closeDateTime = DateUtils.addHours(new Date(),-hour);
            List<Order> orderList = orderMapper.selectOrderStatusByCreateTime(Const.OrderStatusEnum.NO_PAY.getCode(),DateTimeUtil.dateToStr(closeDateTime));
    
            for(Order order : orderList){
                List<OrderItem> orderItemList = orderItemMapper.getByOrderNo(order.getOrderNo());
                for(OrderItem orderItem : orderItemList){
    
                    //一定要用主键where条件,防止锁表。同时必须是支持MySQL的InnoDB。
                    Integer stock = productMapper.selectStockByProductId(orderItem.getProductId());
    
                    //考虑到已生成的订单里的商品,被删除的情况
                    if(stock == null){
                        continue;
                    }
                    Product product = new Product();
                    product.setId(orderItem.getProductId());
                    product.setStock(stock+orderItem.getQuantity());
                    productMapper.updateByPrimaryKeySelective(product);
                }
                orderMapper.closeOrderByOrderId(order.getId());
                log.info("关闭订单OrderNo:{}",order.getOrderNo());
            }
        }
    
    这是源代码,并没有看到加上where state = ?
    回复 有任何疑惑可以回复我~ 2020-06-15 09:23:39
  • 提问者 慕哥6062902 #2
    你没有回答我的问题
    回复 有任何疑惑可以回复我~ 2020-10-06 16:18:09

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信