什麼是超賣
庫存只有1個,當有兩個執行緒過來後,都執行成功了,生成了兩個訂單,這就是超賣
避免超賣的發生
下面的**還是會發生超賣。雖然減庫存,生成訂單在同乙個事務,也對修改庫存做了限制,但是即使stock_count變為0了,這個減庫存的sql操作也不會報錯,導致後面的生成訂單就會正常執行
導致庫存和訂單數量不一致
@transactionalpublic
orderinfo miaosha1(miaoshauser user, goodsvo goods) ")
goodsservice.reducestock(goods);
return
orderservice.createorder(user, goods);
}
修改之後的
@transactionalpublic
orderinfo miaosha(miaoshauser user, goodsvo goods)
boolean res =goodsservice.reducestock(goods);
if(res)
throw
newglobalexception(codemsg.miao_sha_over);
}
總結:避免發生超賣:
1)更新庫存時候,庫存數量作限制stock_count>0
2) 減庫存成功後再建立訂單
3)減庫存,生成訂單在同一事務裡
mysql 超賣 mysql 解決超賣問題的鎖分析
解決超賣問題,常見的方式,利用redis 的原子性去遞減 利用佇列,隊列入隊計數。或者直接打到mysql 層。由mysql 保證不超賣,有幾個玩法。利用屬性不一樣,挺有意思,記錄下。首先,mysql 隔離級別是rr,或者是序列,但是不可能用序列,太慢。其次,為什麼會出現超賣問題?因為這個select...
mysql 樂觀鎖 超賣 秒殺超賣解決方案
方案一 redis事務處理 multi 我們可以使用redis中的監聽 watch 方法,去監聽庫存數量,一旦庫存數量在其他客戶端發生改變,後續操作則會失敗。watch key1 key2 監聽key1 key2有沒有變化,如果有變,則事務取消 方案二 redis分布式鎖 分布式鎖確保只有乙個執行緒...
超賣現象及解決
本專案的超賣類似於電商的秒殺超賣現象 1.不同使用者在讀請求的時候,發現商品庫存足夠,然後同時發起請求,進行秒殺操作,減庫存,導致庫存減為負數。2.同乙個使用者在有庫存的時候,連續發出多個請求,兩個請求同時存在,於是生成多個訂單。對於第一種超賣現象 1 最簡單的方法,更新資料庫減庫存的時候,進行庫存...