【问题标题】:What's the correct way to implement a PHP/MySQL transaction locking mechanism实现PHP / MySQL事务锁定机制的正确方法是什么
【发布时间】:2011-06-25 05:02:26
【问题描述】:

例如,假设您向数千名订阅者发送简报,并宣传“点击此链接的前一百人可获得 10% 的折扣”。作为一个极端的例子,假设在几秒钟内有数千次点击到达。确保在第 100 次点击后锁定的正确方法是什么,这样 101 或 102 位客户就没有机会收到“恭喜获得折扣消息”

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

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

    这里是羊群解决方案的流程图:

    1. 打开锁文件(可以是空文件)
    2. 锁定文件。如果另一个进程已经锁定它,这个调用将阻塞直到另一个锁被释放
    3. 检查用户是否仍有资格做他想做的任何事情
    4. 如果是/否,做点什么
    5. 解锁文件
    6. 关闭文件

    【讨论】:

    • 7.添加代码,以便如果您的 PHP 在步骤 3 或 4 中崩溃,您可以清理锁。否则,任何人都将无能为力。锁很难:-)
    【解决方案2】:

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

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

    【讨论】:

    • 自动增量 PK + 检查 mysql_insert_id()
    【解决方案3】:

    您可以使用BEFORE INSERT 触发器,从另一个表Can you access the auto increment value in MySQL within one statement? 和abort 中提取自动增量(如果它大于100)。

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多