日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php mysql 库存变负数_php解决秒杀并发入库导致的库存负数

發布時間:2023/12/10 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php mysql 库存变负数_php解决秒杀并发入库导致的库存负数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們知道數據庫處理sql是一條條處理的,假設購買商品的流程是這樣的:

sql1:查詢商品庫存

1 if(庫存數量 > 0)

2 {

3 //生成訂單

4 //庫存-1

5 >

當沒有并發時,上面的流程看起來是如此完美,假設同時兩個人下單,而庫存只有1個了,在sql1階段兩個人查詢到的庫存都是>0的,于是最終都執行了sql2,庫存最后變為-1,超售了,要么補庫存,要么等用戶投訴吧。

解決這個問題比較流行的思路:

1.用額外的單進程處理一個隊列,下單請求放到隊列里,一個個處理,就不會有并發的問題了,但是要額外的后臺進程以及延遲問題,不予考慮。

2.數據庫樂觀鎖,大致的意思是先查詢庫存,然后立馬將庫存+1,然后訂單生成后,在更新庫存前再查詢一次庫存,看看跟預期的庫存數量是否保持一致,不一致就回滾,提示用戶庫存不足。

3.根據update結果來判斷,我們可以在sql2的時候加一個判斷條件update ... where 庫存>0,如果返回false,則說明庫存不足,并回滾事務。

4.借助文件排他鎖,在處理下單請求的時候,用flock鎖定一個文件,如果鎖定失敗說明有其他訂單正在處理,此時要么等待要么直接提示用戶"服務器繁忙"

本文要說的是第4種方案,大致代碼如下:

阻塞(等待)模式

$fp = fopen("lock.txt", "w+");

if(flock($fp,LOCK_EX))

{

//..處理訂單

flock($fp,LOCK_UN);

}

fclose($fp);

?>

非阻塞模式

$fp = fopen("lock.txt", "w+");

if(flock($fp,LOCK_EX | LOCK_NB))

{

//..處理訂單

flock($fp,LOCK_UN);

}

else

{

echo "系統繁忙,請稍后再試";

}

fclose($fp);

?>

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家

或 者關注我每天分享技術文章進階PHP架構師?www.zhihu.com

作者:歸一山人

原網站:博客園

來源:https://www.cnblogs.com/guiyishanren/p/11564256.html

總結

以上是生活随笔為你收集整理的php mysql 库存变负数_php解决秒杀并发入库导致的库存负数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。