实现PHP / MySQL事务锁定机制的正确方法是什么

时间:2011-02-10 22:29:17

标签: php

例如,假设您向几千名订阅者发送简报,并宣传“点击此链接的第一百个获得10%的折扣”。作为一个极端的例子,假设数秒的点击在几秒钟内到达。正确的方法是确保在完全锁定第100次点击之后,101或102位客户无法获得“祝贺获得折扣信息”

3 个答案:

答案 0 :(得分:4)

您可以创建一个锁文件并flock($fp, LOCK_EX)来确保只有一个(PHP)进程可以同时打开它。 成功锁定文件后,您将处理该请求,并在完成后flock($fp, LOCK_UN)

$fpfopen()返回的文件句柄。

当然你也可以使用互斥锁,但默认情况下它们不会在PHP中启用。

以下是鸡群解决方案的流程“图表”:

  1. 打开锁定文件(可以只是一个空文件)
  2. 锁定文件。如果另一个进程已经锁定它,则此调用将阻塞,直到另一个锁被释放
  3. 检查用户是否仍有资格做他想做的事情
  4. 如果是/否,请执行某些操作
  5. 解锁文件
  6. 关闭文件

答案 1 :(得分:3)

有一张表,您可以在其中写下答案。然后很容易检查一个特定的响应是否在前100个 - 只需看看它是否在前100行中按相应的字段排序。

让MySQL为您完成锁定的所有艰苦工作!

答案 2 :(得分:0)

您可以拥有BEFORE INSERT触发器,如果​​它超过100,则从另一个表Can you access the auto increment value in MySQL within one statement?abort中提取自动增量。