zoukankan      html  css  js  c++  java
  • 什么是超卖以及怎么解决超卖

    什么是超卖   

    库存只有1个,当有两个线程过来后,都执行成功了,生成了两个订单,这就是超卖

    避免超卖的发生

    下面的代码还是会发生超卖。虽然减库存,生成订单在同一个事务,也对修改库存做了限制,但是即使stock_count变为0了,这个减库存的sql操作也不会报错,导致后面的生成订单就会正常执行

    导致库存和订单数量不一致

        @Transactional
        public OrderInfo miaosha1(MiaoshaUser user, GoodsVo goods) {
            //减库存 下订单 写入秒杀订单
            // 减库存 sql
            // @Update("update miaosha_goods set stock_count = stock_count - 1 where stock_count > 0 and  goods_id = #{goodsId}")
             goodsService.reduceStock(goods);
             return    orderService.createOrder(user, goods);
        }

    修改之后的

        @Transactional
        public OrderInfo miaosha(MiaoshaUser user, GoodsVo goods) {
            //减库存 
            //update miaosha_goods set stock_count = stock_count - 1 where stock_count > 0 and  goods_id = #{goodsId}
            boolean res = goodsService.reduceStock(goods);
            if(res){//执行减库存成功后,才创建订单
                //order_info maiosha_order
                return orderService.createOrder(user, goods);
            }
            throw new GlobalException(CodeMsg.MIAO_SHA_OVER);
        }

    总结:避免发生超卖:

    1)更新库存时候,库存数量作限制stock_count>0

    2)  减库存成功后再创建订单

    3)减库存,生成订单在同一事务里

  • 相关阅读:
    [转]scp用法
    进入docker登录psql数据库对特定表进行操作
    [整]swp文件的处理
    shift+zz保存并退出
    [转]python变量作用域的有趣差别
    git 删除分支操作
    混用参数命名方式,确保顺序在命名之前
    [译]Python面试中8个必考问题
    《浪潮之巅》与我的职业选择
    EBS 用户及其联系人的失效时间
  • 原文地址:https://www.cnblogs.com/moris5013/p/12345951.html
Copyright © 2011-2022 走看看