PHP並發情況下如何防止商品禮品超賣、超發等情況


這是一個令很多人都頭疼的問題 想起之前第一次做商城的時候就被這個問題給難住了

面對這個問題一般的解決辦法有幾個:

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 進行 這里不過多介紹

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM