方案一:使用文件鎖排它鎖
濂溪網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),濂溪網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為濂溪上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的濂溪做網(wǎng)站的公司定做!
flock函數(shù)用于獲取文件的鎖,這個(gè)鎖同時(shí)只能被一個(gè)線程獲取到,其它沒有獲取到鎖的線程要么阻塞,要么獲取失敗
在獲取到鎖的時(shí)候,先查詢庫存,如果庫存大于0,則進(jìn)行下訂單操作,減庫存,然后釋放鎖
方案二:使用Mysql數(shù)據(jù)庫提供的悲觀鎖
Innodb存儲(chǔ)引擎支持行級(jí)鎖,當(dāng)某行數(shù)據(jù)被鎖定時(shí),其他進(jìn)程不能對(duì)這行數(shù)據(jù)進(jìn)行操作
先查詢并鎖定行:select stock_num from table where id=1 for update
if(stock_num 0){
//下訂單
update table set stock_num=stock-1 where id=1
}
?php
//連接數(shù)據(jù)庫
$con=mysqli_connect("192.168.2.186","root","root","test");
//查詢商品數(shù)量是否大于0,大于0才能下單,并減少庫存
$fp = fopen("lock.txt", "r");
//加鎖
if(flock($fp,LOCK_EX))
{
$res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
if($res['total']0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');}
//執(zhí)行完成解鎖
flock($fp,LOCK_UN);
}
//關(guān)閉文件
fclose($fp);
unset($res);
mysqli_close($con);
?
方案一:使用文件鎖排它鎖
flock函數(shù)用于獲取文件的鎖,這個(gè)鎖同時(shí)只能被一個(gè)線程獲取到,其它沒有獲取到鎖的線程要么阻塞,要么獲取失敗
在獲取到鎖的時(shí)候,先查詢庫存,如果庫存大于0,則進(jìn)行下訂單操作,減庫存,然后釋放鎖
方案二:使用隊(duì)列
將用戶的下單請(qǐng)求依次存入一個(gè)隊(duì)列中,后臺(tái)用一個(gè)單獨(dú)的進(jìn)程處理隊(duì)列中的下單請(qǐng)求
以PHP語言為例,對(duì)微信支付的開發(fā)流程進(jìn)行一下說明:
1.獲取訂單信息。
2.根據(jù)訂單信息和支付相關(guān)的賬號(hào)生成sign,并且生成支付參數(shù)。
3.將支付參數(shù)信息POST到微信服務(wù)器,獲取返回信息。
4.根據(jù)返回信息生成相應(yīng)的支付代碼(微信內(nèi)部)或是支付二維碼(非微信內(nèi)),完成支付。