zoukankan      html  css  js  c++  java
  • java初探(1)之防止库存为负以及防超买

    在秒杀业务中,会出现当只剩一个库存时,但有多个人仍然秒杀成功,且都减库存成功,因此,在减库存,更新数据库的时候,需要在sql语句上进行判断,是否库存大于0.

    @Update("update miaosha_goods set stock_count = stock_count - 1 where goods_id = #{goodsId} and stock_count > 0")
        void reduceStock(MiaoshaGoods g);

    这样就不会出现库存为负的情况。

    针对超卖的情况,一个人发出了两个请求,相隔时间很短,因此,在进入我们秒杀逻辑的时候,如下

    //判断库存
            GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
            Integer stock= goods.getStockCount();
    
            if(stock<=0){
                model.addAttribute("errmsg", CodeMsg.MIAO_SHA_OVER.getMsg());
                return Result.error(CodeMsg.MIAO_SHA_OVER);
            }
    
            //判断是否已经秒杀到了
            MiaoshaOrder order=orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);
    
            if(order!=null){
                return Result.error(CodeMsg.REPEATE_MIAOSHA);
            }
    
            //进行秒杀逻辑
            //减库存,下订单,写入秒杀订单
            OrderInfo orderInfo=miaoshaService.miaosha(user, goods);

    判断库存时,不会有任何问题

    判断是否秒杀的时候,也不会有问题,因为相隔时间很短,都没有秒杀到。

    因此顺利的进入了减库存,也很轻松的减了库存。

    最后因为已经没有了判断是否创建订单的判断,两个请求都创建了订单,导致同一个用户的两个请求,都完成了秒杀。

    解决方法:

    在创建订单时,需要保存两个订单,如果两个订单都创建成功了,才会创建订单成功。由于同一个用户有相同的用户id,因此,可以在数据库中建立用户与商品的唯一索引,即,一个用户只能创建一个商品的订单,这样,当第二个请求创建订单时,数据库就会报错,事务就会回滚,不能完成秒杀。

  • 相关阅读:
    matplotlib直方图学习小记
    matplotlib饼状图学习小记
    P2306 被yyh虐的mzc
    P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
    51NOD 1445 变色DNA
    51NOD 1459 迷宫游戏
    CODEVS 1001 舒适的路线
    P4514 上帝造题的七分钟
    1082 线段树练习 3 && 树状数组区间修改区间查询
    P4145 上帝造题的七分钟2 / 花神游历各国
  • 原文地址:https://www.cnblogs.com/lovejune/p/12343747.html
Copyright © 2011-2022 走看看