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,因此,可以在數據庫中建立用戶與商品的唯一索引,即,一個用戶只能創建一個商品的訂單,這樣,當第二個請求創建訂單時,數據庫就會報錯,事務就會回滾,不能完成秒殺。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM