2011-02-10 68 views
2

例如,假設您向幾千名訂戶發送了簡訊,並且您宣傳「點擊此鏈接的前100名可獲得10%的折扣」。作爲一個極端的例子,假設數千次點擊在幾秒鐘內到達。有什麼正確的方法來確保在100次點擊事件被鎖定之後,101或102個客戶沒有機會得到「恭喜獲得折扣信息」實現PHP/MySQL交易鎖定機制的正確方法

回答

4

您可以創建一個鎖定文件和flock($fp, LOCK_EX)它以確保只有一個(PHP)進程可以同時打開它。 成功鎖定文件後,您處理該請求,並在完成時flock($fp, LOCK_UN)它。

$fp是由fopen()返回的文件句柄。

當然,您也可以使用互斥鎖,但它們在PHP中默認情況下未啓用。

這裏的一個流「表」羊羣溶液:

  1. 打開鎖文件(可以簡單地一個空文件)
  2. 鎖定該文件。如果另一個進程已經鎖定它,這個調用將阻塞,直到另外一個鎖釋放
  3. 檢查用戶是否仍然有資格做任何他想做的事
  4. 如果是/否,做一些
  5. 解鎖文件
  6. 關閉文件
+1

7.添加代碼,這樣,如果在步驟3或4的PHP崩潰了,你收拾鎖。否則,沒有人可以做任何事情。鎖是困難的:-) – James 2011-02-10 22:46:26

3

具有這樣你寫的響應的表,你得到他們。然後很容易就可以檢查一個特定的響應是否在前100箇中 - 只要查看是否在前100行中按相應字段排序。

讓MySQL爲你做所有的鎖定工作!

+0

自動增加PK +檢查mysql_insert_id()<= 100是一個聰明而且非常簡單的解決方案。 – 2011-02-10 22:45:04