現實庫存處理記錄

2021-07-02 15:03:54 字數 497 閱讀 2431

現今我們系統庫存以sku為單位,每個sku都有對應庫存。

庫存資訊我們會記錄在乙個資料庫表中,為了效能每次上線我們會將這個資料庫表中的庫存放入記憶體中。

需要保證多個使用者同時操作記憶體庫存時的執行緒安全性,這邊我們是通過呼叫tair的incr和desc命令保證庫存增減是串形的。

但是有一種可能:

記憶體庫存為1件,2個使用者同時購買,第乙個使用者減完後庫存為0,第二個使用者為-1。這時如果不做處理就會產生超賣,我們這邊會判斷如果使用者在操作庫存時,發現減後的庫存量是-1這時我們會加回去,並返回「庫存不足」給使用者。

最壞的可能性如果是tair掛了,導致所有記憶體庫存不可用,這時我們會用乙個庫存同步job為同步庫存。

對於如果使用者刪除購物車或者購物車超時的情況,這時需要對使用者購物車中對應sku增加相應的庫存量。這時需要保證有個條件點能夠使增加庫存這部分不重複加。

我們這邊先呼叫tair的del方法(tair會加鎖)然後看返回是否成功,只有第乙個執行緒刪除的時候才會成功,成功之後再做庫存的增加。

「先進先出」的庫存處理

很經典的 先進先出 的庫存處理的sql語句。create table tmp 建立臨時表 tmp id int identity 1,1 建立列id,並且每次新增一條記錄就會加1 單價 decimal 18,2 not null 數量 decimal 18,2 not null 已出數量 decim...

php 處理庫存超賣的幾種處理方法

第一種方法 使用mysql資料庫的鎖機制。在事務中使用 for update 語句,在事務處理完成之後釋放這一條資料。使用tp5的框架 public function mysqllock else else 第二種方法 redis 事務。public function start reids tra...

PHP處理庫存超賣的幾種處理方法???

第一種方法 使用mysql資料庫的鎖機制。在事務中使用 for update 語句,在事務處理完成之後釋放這一條資料。使用tp5的框架 public function mysqllock else else 第二種方法 redis 事務。public function start reids tra...