在秒殺業務中,會出現當只剩一個庫存時,但有多個人仍然秒殺成功,且都減庫存成功,因此,在減庫存,更新數據庫的時候,需要在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,因此,可以在數據庫中建立用戶與商品的唯一索引,即,一個用戶只能創建一個商品的訂單,這樣,當第二個請求創建訂單時,數據庫就會報錯,事務就會回滾,不能完成秒殺。
