2011-02-10 66 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