在正常的電商平台購物場景中,使用者的實際購買過程一般分為兩步:下單和支付。
其中減庫存操作一般有如下3個方式:
秒殺系統一般採用「下單減庫存」,邏輯上更為簡單,效能上也更佔優勢。
即當買家下單後,在商品的總庫存中減去買家購買數量。下單減庫存是最簡單的減庫存方式,也是控制最精確的一種,下單時直接通過資料庫的事務機制控制商品庫存,這樣一定不會出現超賣的情況。但是有個最大的侷限就是,有些人下單後可能並不會付款,即惡意下單。
針對惡意下單這種情況,解決辦法還是要結合安全和反作弊措施來制止。例如,給經常下單不付款的買家進行識別打標(可以在被打標的買家下單時不減庫存),給某些類目設定最大購買件數(參加活動的商品一人最多只能買3件),以及對重複下單付款的操作進行次數限制等。
即買家下單後,並不立即減庫存,而是等到有使用者付款後才真正減庫存,否則庫存一直保留給其他買家。但因為付款時才減庫存,如果併發比較高,有可能出現買家下單後付不了款的情況,因為可能商品已經被其他人買走了,導致庫存超賣。
業務系統中最常見的就是預扣庫存方案,比如買高鐵票時候,下單後一般都有個「有效付款時間」,超過這個時間訂單自動釋放。
這種方式相對複雜一些,買家下單後,庫存為其保留一定的時間(比如10分鐘),超過這個時間,庫存將會自動釋放,釋放後其他買家就可以繼續購買。在買家付款前,系統會校驗該訂單的庫存是否還有保留,如果沒有保留,則再次嘗試預扣;如果庫存不足(也就是預扣失敗)則不允許繼續付款;如果預扣成功,則完成付款並實際地減去庫存。
併發減庫存 redis vs mysql
業務 商品有庫存,如10000 每買乙個商品 庫存就減一 減庫存可以通過mysql來實現 如 update product stock set stock stock 1 where product id 1 and stock 0 也可以使用redis來實現 如 decr 1 stock inte...
mysql 使用樂觀鎖減庫存
方法1 update t goods set num num where id and num 0 and status 1方法2 update t goods set num num where id and num and status 1不建議使用版本號更新的方式 版本號的方法並不是適用於所有...
redis預減庫存 rabbitmq非同步下單
減緩存 新增佇列 responsebody domiaosha public resultbean findall requestparam goodsid long goodsid,pathvariable string path,user user,long addresssid throws ...