這是一個令很多人都頭疼的問題 想起之前第一次做商城的時候就被這個問題給難住了
面對這個問題一般的解決辦法有幾個:
1:適用於較小型應用 一般采用 鎖 來解決
鎖又有封為樂觀鎖以及悲觀鎖 悲觀鎖就不做過多的解釋了,因為性能上比較不靠譜 所以建議采用樂觀鎖的解決方案
樂觀鎖
其實就有是在更新數據的時候加多幾個where 條件 這樣能夠有效的防止多用戶同時對一條數據進行操作
例如:
UPDATE FROM goods SET num = num - 1 WHERE goodsid = 2 AND num > 0
這條語句僅僅只是加多了個 WHERE 條件 num > 0 但是其足以應付一般的應用的並發情況
例如:
當前庫存 num 為 1
且有兩個用戶同時發起下單請求
那么這時候 稍微慢的那個用戶就會遇到 num = 0 的情況 所以where條件不成立 插入失敗 結果就是只有一個人下單成功。
當然還有更多情況可使用樂觀鎖解決 例如取不重復數據時 可多添加幾個where 字段 取完即更新它 那么下次就不會有其他用戶取到
如果是針對只有一件商品的秒殺情況 那么可以這么解決:
訂單表(goodsid(商品) 加唯一索引)
start transaction; insert into buy_record... if(唯一索引報錯?){ 拋異常,已經秒過了,回滾.. } UPDATE goods SET num=num-1 WHERE goodsid=2 AND num>0 ; if(受影響行數<=0){ 拋異常,商品秒完了,回滾... }
2:大型應用 高並發
一般采用 Redis 進行 這里不過多介紹