什麼是超賣以及怎麼解決超賣

2022-02-19 05:29:27 字數 775 閱讀 4367

什麼是超賣   

庫存只有1個,當有兩個執行緒過來後,都執行成功了,生成了兩個訂單,這就是超賣

避免超賣的發生

下面的**還是會發生超賣。雖然減庫存,生成訂單在同乙個事務,也對修改庫存做了限制,但是即使stock_count變為0了,這個減庫存的sql操作也不會報錯,導致後面的生成訂單就會正常執行

導致庫存和訂單數量不一致

@transactional

public

orderinfo miaosha1(miaoshauser user, goodsvo goods) ")

goodsservice.reducestock(goods);

return

orderservice.createorder(user, goods);

}

修改之後的

@transactional

public

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 最簡單的方法,更新資料庫減庫存的時候,進行庫存...