采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这里只对商品表加了锁,为什么不对订单表或者订单详情表的那些记录也加锁呢。我理解的是,商品表加锁是必须的,因为要对库存做更新,而对订单表则是把状态改成了无效订单,订单详情表本身无任何变化,所以只是业务上,没必要去对订单表加锁,是这个意思么?如果纯粹从逻辑上来讲,是不是也需要呢?
脑子有点乱,我就想定时任务在执行的时候,要是恰好这个用户去修改了订单的状态,那会不会数据不安全的问题,麻烦老师帮忙讲解下
同学,所以在修改订单状态的时候需要加条件判断,比如set state=? where state=?,不满足条件就不会修改成功
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 = ?
你没有回答我的问题
登录后可查看更多问答,登录/注册
Tomcat集群+Redis分布式+代码重构+源码原理解析
1.6k 17
2.6k 12
1.7k 12
1.6k 11
1.9k 10