電商 如何防止商品超賣

2021-10-06 07:25:35 字數 915 閱讀 9498

怎麼導致超賣?

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

解決超賣:

redis分布式鎖(根據商品的sku阻性)。獲得鎖**塊內,進行商品減資料資料庫樂觀鎖(庫中數量》購買數量)。

生成訂單資訊,生成待 支付流水。前提使用者商品數量更新成功。

保證兩步在乙個事務中,同時成功和失敗,保證資料一致性(避免在生成訂單時失敗或者停機導致商品少賣)。

併發測試工具jmeter

qa:

為什麼獲得分布式鎖後,執行**中只有一條更新庫存語句

為了減少鎖的持有時間,生成訂單和使用者付款都不會產生高併發,不用放在鎖中執行。

搶購人數超級多會直接撐爆redis鎖佇列,怎麼處理?

請求限流,全域性佇列異常iiiegaislabeepeplian處理

如何保證使用者公平(按照順序)購買?

多執行緒在獲取不到分布式鎖的時候,會將當前執行緒新增到佇列中,採用先進先出的模式逐個獲得鎖,來確保使用者公平購買,不存在插隊的情況。

為什麼要加鎖,採用單執行緒不就可以了嗎?

的確可以解決商品超賣。但高併發的業務系統的響應速度非常慢。

使用者誰先付款成功,商品賣給誰,好實現嗎?

這個不行,因為支付走的第三方,使用者同時付款機率非常大,超賣的機率也隨之增加了。有實現的方式歡迎補充下。

電商超賣問題

本專案的超賣類似於電商的秒殺超賣現象 1.不同使用者在讀請求的時候,發現商品庫存足夠,然後同時發起請求,進行秒殺操作,減庫存,導致庫存減為負數。2.同乙個使用者在有庫存的時候,連續發出多個請求,兩個請求同時存在,於是生成多個訂單。對於第一種超賣現象 1 最簡單的方法,更新資料庫減庫存的時候,進行庫存...

電商防止庫存超賣解決方案

悲觀鎖,也就是在修改資料的時候,採用鎖定狀態,排斥外部請求的修改。遇到加鎖的狀態,就必須等待。可以採用redis佇列 mysql事務控制的方案,下面是流程圖 mysql的執行 begintranse 開啟事務 try catch e exception commit 提交事務 先執行update鎖住...

電商超賣現象的解決思路

在進行電商平台開發的時候,我們必定需要考慮到商品的超賣現象或者是秒殺模組功能的實現,因此不得不考慮到高併發所帶來的問題,綜合網上的各類部落格文章,我對商品超賣這樣的問題處理進行了從淺到深的逐步分析。秒殺和搶購功能類似 我們先從原先的方法來談論可能會出現什麼問題?原始方法就是直接查詢請求是否符合庫存數...