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());returnResult.error(CodeMsg.MIAO_SHA_OVER);
}//判斷是否已經秒殺到了
MiaoshaOrder order=orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);if(order!=null){returnResult.error(CodeMsg.REPEATE_MIAOSHA);
}//進行秒殺邏輯//減庫存,下訂單,寫入秒殺訂單
OrderInfo orderInfo=miaoshaService.miaosha(user, goods);
判斷庫存時,不會有任何問題
判斷是否秒殺的時候,也不會有問題,因為相隔時間很短,都沒有秒殺到。
因此順利的進入了減庫存,也很輕松的減了庫存。
最后因為已經沒有了判斷是否創建訂單的判斷,兩個請求都創建了訂單,導致同一個用戶的兩個請求,都完成了秒殺。
解決方法:
在創建訂單時,需要保存兩個訂單,如果兩個訂單都創建成功了,才會創建訂單成功。由于同一個用戶有相同的用戶id,因此,可以在數據庫中建立用戶與商品的唯一索引,即,一個用戶只能創建一個商品的訂單,這樣,當第二個請求創建訂單時,數據庫就會報錯,事務就會回滾,不能完成秒殺。
原文:https://www.cnblogs.com/lovejune/p/12343747.html
總結
以上是生活随笔為你收集整理的java防止库存超买_java初探(1)之防止库存为负以及防超买的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.718解压版安装_MySQ
- 下一篇: java 图形库_OpenGL开放图形j