想做做個第三方支付介面,擔心下訂單這一塊可能出現並發.
<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>
從網路上找了上面一段程式碼修改下,總覺得有點虛,不知道行不行得通,或者有更好的建議 ?
可以藉助redis的原子行操作實現鎖定,並設定一個key來做標誌。
可以用nmq來搞。
樓主透過文件來加獨佔鎖,是不是意味著每筆訂單的生成都會,先獲取鎖,然後再創建訂單?這就相當於把整個訂單的創建變成了一個串行操作,下單的TPS可能會小的可憐
樓主說的並發是因為,用戶下單按鈕點了兩次,導致重複下單麼?如果是,那麼這種場景的解決方案有很多,參照哪些分佈式事務的中間件可以保證冪等性,透過requestId/token
都可以解決你的問題
不需要在程式中設定鎖,在資料庫中做唯一索引就可以了,這樣效能是最好的。
用redis加鎖實現
swoole+mysql