php解決搶購秒殺抽獎(jiǎng)等大流量并發(fā)入庫導(dǎo)致的庫存負(fù)數(shù)的問題
我們知道數(shù)據(jù)庫處理sql是一條條處理的,假設(shè)購買商品的流程是這樣的:
sql1:查詢商品庫存
if(庫存數(shù)量 > 0)
{
//生成訂單...
sql2:庫存-1
}
當(dāng)沒有并發(fā)時(shí),上面的流程看起來是如此完美,假設(shè)同時(shí)兩個(gè)人下單,而庫存只有1個(gè)了,在sql1階段兩個(gè)人查詢到的庫存都是>0的,于是最終都執(zhí)行了sql2,庫存最后變?yōu)?1,超售了,要么補(bǔ)庫存,要么等用戶投訴吧。
解決這個(gè)問題比較流行的思路:
1.用額外的單進(jìn)程處理一個(gè)隊(duì)列,下單請求放到隊(duì)列里,一個(gè)個(gè)處理,就不會有并發(fā)的問題了,但是要額外的后臺進(jìn)程以及延遲問題,不予考慮。
2.數(shù)據(jù)庫樂觀鎖,大致的意思是先查詢庫存,然后立馬將庫存+1,然后訂單生成后,在更新庫存前再查詢一次庫存,看看跟預(yù)期的庫存數(shù)量是否保持一致,不一致就回滾,提示用戶庫存不足。
3.根據(jù)update結(jié)果來判斷,我們可以在sql2的時(shí)候加一個(gè)判斷條件update ... where 庫存>0,如果返回false,則說明庫存不足,并回滾事務(wù)。
4.借助文件排他鎖,在處理下單請求的時(shí)候,用flock鎖定一個(gè)文件,如果鎖定失敗說明有其他訂單正在處理,此時(shí)要么等待要么直接提示用戶"服務(wù)器繁忙"
本文要說的是第4種方案,大致代碼如下:
阻塞(等待)模式
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..處理訂單
flock($fp,LOCK_UN);
}
fclose($fp);
?>
非阻塞模式
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
//..處理訂單
flock($fp,LOCK_UN);
}
else
{
echo "系統(tǒng)繁忙,請稍后再試";
}
fclose($fp);
?>
- PHP+JS實(shí)現(xiàn)的商品秒殺倒計(jì)時(shí)用法示例
- PHP 類商品秒殺計(jì)時(shí)實(shí)現(xiàn)代碼
- php結(jié)合redis實(shí)現(xiàn)高并發(fā)下的搶購、秒殺功能的實(shí)例
- php+redis實(shí)現(xiàn)商城秒殺功能
- PHP多線程模擬實(shí)現(xiàn)秒殺搶單
- yii框架redis結(jié)合php實(shí)現(xiàn)秒殺效果(實(shí)例代碼)
- PHP精確到毫秒秒殺倒計(jì)時(shí)實(shí)例詳解
- php微信公眾號開發(fā)之秒殺
- php和redis實(shí)現(xiàn)秒殺活動(dòng)的流程
- PHP結(jié)合Redis+MySQL實(shí)現(xiàn)冷熱數(shù)據(jù)交換應(yīng)用案例詳解
- PHP的Laravel框架結(jié)合MySQL與Redis數(shù)據(jù)庫的使用部署
- PHP商品秒殺問題解決方案實(shí)例詳解【mysql與redis】
相關(guān)文章
在php中設(shè)置session用memcache來存儲的方法總結(jié)
memcached提供了一個(gè)自定義的session處理器可以被用于存儲用戶session數(shù)據(jù)到memcached服務(wù)端,下面通過本文給大家介紹在php中設(shè)置session用memcache來存儲的方法總結(jié),對php session memcache相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Laravel 實(shí)現(xiàn)添加多語言提示信息
今天小編就為大家分享一篇Laravel 實(shí)現(xiàn)添加多語言提示信息,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
WordPress免插件實(shí)現(xiàn)面包屑導(dǎo)航的示例代碼
這篇文章主要介紹了WordPress免插件實(shí)現(xiàn)面包屑導(dǎo)航,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
tp5修改(實(shí)現(xiàn)即點(diǎn)即改)
今天小編就為大家分享一篇tp5修改(實(shí)現(xiàn)即點(diǎn)即改),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
laravel 輸出最后執(zhí)行sql 附:whereIn的使用方法
今天小編就為大家分享一篇laravel 輸出最后執(zhí)行sql 附:whereIn的使用方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
Laravel實(shí)現(xiàn)搜索的時(shí)候分頁并攜帶參數(shù)
今天小編就為大家分享一篇Laravel實(shí)現(xiàn)搜索的時(shí)候分頁并攜帶參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
PHP中通過exec調(diào)用python腳本報(bào)ModuleNotFoundError錯(cuò)誤問題及解決方法
這篇文章主要介紹了解決php中通過exec調(diào)用python腳本報(bào)ModuleNotFoundError錯(cuò)誤,本文是在 Ubuntu 20.04 上以 ubuntu 用戶身份進(jìn)行的測試,需要的朋友可以參考下2023-07-07
PHP 中TP5 Request 請求對象的實(shí)例詳解
這篇文章主要介紹了PHP 中TP5 Request 請求對象的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)代碼幫助大家理解這部分內(nèi)容,需要的朋友可以參考下2017-07-07

