針對庫存數量變成了負數的問題

2021-08-21 04:29:11 字數 1263 閱讀 7949

此文章只解決,針對庫存變成負數進行淺顯的分析並解決。對於高併發的問題不予考慮。自己的技術沒有達到嘛!

先說下問題:

一般剛接觸減少庫存的問題都會這樣寫:

查詢庫存是否夠用->變更庫存數量->結束

這種情況是如何出現的呢?模擬一下:

(1)使用者1查詢id為1的商品的庫存為1,剛查完還沒有進行修改庫存

(2)使用者2查詢id為1的商品的庫存也為1(因為使用者1還沒有修改),也還沒進行修改

(3)使用者1進行修改庫存,庫存變成0

(4)使用者2進行修改庫存,庫存變成-1

就是這個樣子

解決的辦法:

利用事務,鎖。當乙個鏈結進入到事務,那麼在修改一條資料之後,只要還沒有commit。那麼其他人只能等候。

這裡的鎖的原理就不說了。因為涉及到的東西特別的多。有興趣的可以去看

mysql技術內幕:innodb儲存引擎

這本書。

說下實際解決方案:

(1)使用者1開啟事務,並且查詢庫存為1

(2)使用者2開啟事務,並且查詢庫存也為1(這個鎖只對update有效果,現在可以這麼理解哈。因為說的太多,扯的就多了。可以自己看書了解這是為什麼)

(3)使用者1修改庫存,庫存為0(但是記住,你還沒有提交事務)

(4)使用者2修改庫存,修改不了,因為在等待使用者1提交庫存,他才可以修改

(5)使用者1,查詢庫存,庫存為0,ok,提交事務

(6)使用者2,等待結束,修改庫存,庫存為-1(但是記住,還沒有提交事務,可以回滾哦)

(7)使用者2,查詢庫存,庫存為-1,no,回滾

這裡使用者1,修改之後沒有提交事務,當使用者2修改的時候,處於等待狀態

這裡還有最重要的一點哈。你的表引擎必須是innodb的。myisam是不支援事務的。

好了,這篇文章主要是針對初級的,沒有考慮高併發。以後會再寫一篇針對高併發的解決方案。不過這個還是基礎吧。

針對於高併發,主要是讓資料庫處理的請求少一些,把一些不必要的避之門外。

SQL實時庫存數量結存

select dbo.t stockbase.物料編號 dbo.t stockbase.物料名稱 dbo.t stockbalance.期初輔助數量 dbo.t stockbalance.期初數量 isnull a.入庫輔助數量,0 as 入庫輔助數量 isnull a.入庫數量,0 as 入庫數量...

庫存管理 經濟訂貨數量EOQ

eoq 2ca h 1 2 其中 a 以單位計的年度使用量 c 每個訂單的獲取性成本 h 每個單位持有成本 h是乙個單位產品一年的持有成本 example 若產品持有成本是 5 產品單價是 8.00usd 那麼用貨幣表示的持有成本為 h 8.00usd 5 0.40usd 那麼如果訂單數量為每年 6...

針對能源和公用事業的網路攻擊數量正在上公升

tripwire最近對能源,公用事業,石油和天然氣行業150多個it專業人士的調查顯示,針對能源領域的網路攻擊數量正在上公升。調查結果顯示,在過去十二個月中,所有受訪的it專業人員當中有77 承認他們至少遭遇一種網路攻擊,同時攻擊當中有78 來自於外部。同樣的受訪者稱,在過去乙個月內針對基礎設施的網...