首頁  >  文章  >  後端開發  >  mysql - php並發處理 ?

mysql - php並發處理 ?

WBOY
WBOY原創
2016-08-04 09:20:53876瀏覽

想做做個第三方支付介面,擔心下訂單這一塊可能出現並發.

<code><?php

$fp = fopen('test.txt', 'r');

$try = 10;

do{
    $lock = flock($fp,LOCK_EX);//独占锁
    //没有获得锁释放cpu重新获取
    if(!lock){
        usleep(50000);  //0.05
    }
}while(!$lock && --$try > 0);

if($lock){

    /***********拿到锁的用户执行********/

    //在这里生成订单号,写入数据库, 跳转到支付页面.....

    flock($fp,LOCK_UN);
    fclose($fp);
}else{
    fclose($fp);
    die("系统繁忙,稍后再试");
}</code>

從網路上找了上面一段程式碼修改下,總覺得有點虛,不知道行不行得通,或者有更好的建議 ?

回覆內容:

想做做個第三方支付介面,擔心下訂單這一塊可能出現並發.

<code><?php

$fp = fopen('test.txt', 'r');

$try = 10;

do{
    $lock = flock($fp,LOCK_EX);//独占锁
    //没有获得锁释放cpu重新获取
    if(!lock){
        usleep(50000);  //0.05
    }
}while(!$lock && --$try > 0);

if($lock){

    /***********拿到锁的用户执行********/

    //在这里生成订单号,写入数据库, 跳转到支付页面.....

    flock($fp,LOCK_UN);
    fclose($fp);
}else{
    fclose($fp);
    die("系统繁忙,稍后再试");
}</code>

從網路上找了上面一段程式碼修改下,總覺得有點虛,不知道行不行得通,或者有更好的建議 ?

  1. 可以藉助redis的原子行操作實現鎖定,並設定一個key來做標誌。

  2. 可以用nmq來搞。

  1. 樓主透過文件來加獨佔鎖,是不是意味著每筆訂單的生成都會,先獲取鎖,然後再創建訂單?這就相當於把整個訂單的創建變成了一個串行操作,下單的TPS可能會小的可憐

  2. 樓主說的並發是因為,用戶下單按鈕點了兩次,導致重複下單麼?如果是,那麼這種場景的解決方案有很多,參照哪些分佈式事務的中間件可以保證冪等性,透過requestId/token都可以解決你的問題

不需要在程式中設定鎖,在資料庫中做唯一索引就可以了,這樣效能是最好的。

用redis加鎖實現

swoole+mysql

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn