怎麼保證促銷商品不會超賣

2021-08-08 17:49:10 字數 606 閱讀 1948

這個問題是我們當時開發時遇到的乙個難點,超賣的原因主要是下的訂單的數目和我們要**的商品的數目不一致導致的,每次總是訂單的數比我們的**商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:

第一種方案是:①在每次下訂單前我們判斷**商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上乙個條件,只更改商品庫存大於0的商品的庫存,當時我們使用ab進行壓力測試,當併發超過500,訪問量超過2000時,還是會出現超賣現象。所以被我們否定了。

第二種方案是:②使用mysql的事務加排他鎖來解決,首先我們選擇資料庫的儲存引擎為innodb,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高併發測試時,對資料庫的效能影響很大,導致資料庫的壓力很大,最終也被我們否定了。

第三種方案是:③使用檔案鎖實現。當使用者搶到一件**商品後先觸發檔案鎖,防止其他使用者進入,該使用者搶到**品後再解開檔案鎖,放其他使用者進行操作。這樣可以解決超賣的問題,但是會導致檔案得i/o開銷很大。

最後我們使用了redis的佇列來實現。將要**的商品數量以佇列的方式存入redis中,每當使用者搶到一件**商品則從佇列中刪除乙個資料,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們採取這種方式來實現

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

什麼是超賣 庫存只有1個,當有兩個執行緒過來後,都執行成功了,生成了兩個訂單,這就是超賣 避免超賣的發生 下面的 還是會發生超賣。雖然減庫存,生成訂單在同乙個事務,也對修改庫存做了限制,但是即使stock count變為0了,這個減庫存的sql操作也不會報錯,導致後面的生成訂單就會正常執行 導致庫存...

電商 如何防止商品超賣

怎麼導致超賣?多個使用者同時購買同一件商品 相同sku 產生高併發多執行緒。如果商品的個數僅有1個,a執行緒獲取到結果時因為剩餘數量大於0,生成訂單 使用者付款。此時若在a執行緒生成訂單的途中,b執行緒獲取的商品剩餘數量是大於0的,也會生成訂單 使用者付款。導致結果只有一件商品賣了兩次,超賣了。解決...

商品庫超賣的樂觀鎖

商品庫存的樂觀鎖實現。出現場景 避免商品出現超賣 即成功下單的訂單中商品的庫存數量大於商品現有的庫存量,則稱為商品超賣 的問題,核心技術是利用資料庫的事務鎖機制,即不允許同一商品的庫存記錄在同一時間被不同的兩個資料庫事務修改。功能實現 在前柔性事務介紹中所提到的,使用者在進行商品下單操作中,會進行一...