最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php解決搶購(gòu)秒殺抽獎(jiǎng)等大流量并發(fā)入庫(kù)導(dǎo)致的庫(kù)存負(fù)數(shù)的問題

 更新時(shí)間:2014年06月19日 09:29:25   投稿:hebedich  
最近在做一個(gè)團(tuán)購(gòu)項(xiàng)目,遇到個(gè)問題,就是在搶購(gòu)、秒殺、抽獎(jiǎng)等活動(dòng)時(shí),庫(kù)存數(shù)量有限,但是同時(shí)下單人數(shù)超過了庫(kù)存數(shù)量,就會(huì)導(dǎo)致商品超售問題。那么我們?cè)趺磥斫鉀Q這個(gè)問題呢,我的思路如下:

我們知道數(shù)據(jù)庫(kù)處理sql是一條條處理的,假設(shè)購(gòu)買商品的流程是這樣的:

sql1:查詢商品庫(kù)存

if(庫(kù)存數(shù)量 > 0)
{
  //生成訂單...
  sql2:庫(kù)存-1
}

當(dāng)沒有并發(fā)時(shí),上面的流程看起來是如此完美,假設(shè)同時(shí)兩個(gè)人下單,而庫(kù)存只有1個(gè)了,在sql1階段兩個(gè)人查詢到的庫(kù)存都是>0的,于是最終都執(zhí)行了sql2,庫(kù)存最后變?yōu)?1,超售了,要么補(bǔ)庫(kù)存,要么等用戶投訴吧。

解決這個(gè)問題比較流行的思路:

1.用額外的單進(jìn)程處理一個(gè)隊(duì)列,下單請(qǐng)求放到隊(duì)列里,一個(gè)個(gè)處理,就不會(huì)有并發(fā)的問題了,但是要額外的后臺(tái)進(jìn)程以及延遲問題,不予考慮。

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

3.根據(jù)update結(jié)果來判斷,我們可以在sql2的時(shí)候加一個(gè)判斷條件update ... where 庫(kù)存>0,如果返回false,則說明庫(kù)存不足,并回滾事務(wù)。

4.借助文件排他鎖,在處理下單請(qǐng)求的時(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)繁忙,請(qǐng)稍后再試";
}

fclose($fp);
?>

相關(guān)文章

最新評(píng)論

米泉市| 乌拉特中旗| 揭东县| 万年县| 加查县| 开江县| 景宁| 任丘市| 友谊县| 彭山县| 华池县| 岗巴县| 涿州市| 翼城县| 长治市| 临猗县| 乌鲁木齐市| 望都县| 深水埗区| 吉林市| 雅江县| 连城县| 保定市| 宿松县| 瓦房店市| 淳化县| 宜春市| 高碑店市| 屯门区| 临汾市| 辽阳市| 蓬安县| 北票市| 建德市| 屏东市| 家居| 柳州市| 乌苏市| 庆城县| 仪陇县| 衡东县|