php - 防止多个数据库访问 (PHP)

标签 php mysql sql

假设我有一个数据库,其中包含应运行的事件数据:

事件 1 - 凌晨 01:00

事件 2 - 凌晨 02:00

事件 3 - 凌晨 03:00

如果用户重新加载页面,这些事件会在某些条件下被触发(例如,如果他在凌晨 04:00 重新加载页面,则所有事件都会被触发)

如果玩家 1 和玩家 2 在凌晨 04:00 同时重新加载页面,会发生什么:

两者都从数据库中获取这些事件。

两者都运行这些事件。

=> 事件加倍。

当然,一旦事件完成,它就会被删除,但是只要脚本还没有完成事件,它就会保留在数据库中,并且其他玩家如果重新加载页面也会运行它们。

有没有办法防止这种情况发生,例如对 SQL 说“嘿,请阻止 id 1、2 和 3 选择”?

最佳答案

您需要某种锁定机制来完成您想要的操作。这是一种机制,使用作业运行时间的日志表。

作业要做的第一件事就是向表中插入一条记录,表明它正在运行。

作业所做的第二事情是检查当前正在运行的作业是否早于该作业开始。如果是这样,那么它会删除或更新其作业记录,因此没有任何内容正在运行。

作业所做的最后一件事是更新/删除其记录以表示它没有运行。

这些操作将充当锁定机制。

逻辑中的“早于这份工作”部分应该消除竞争条件——假设时间上没有联系。您也可以使用自动递增的 id 来实现此目的。

注意:当作业失败时,这可能会遇到问题。这可能是由于作业本身或服务器停机造成的。如果您知道运行时间始终少于 10 分钟(左右),则可以将此逻辑合并到检查中。

关于php - 防止多个数据库访问 (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27580079/

相关文章:

php - 如何在 PHP 中实现基本的 "Most Popular Post"脚本?

php - 如何让正则表达式忽略括号之间的所有内容?

mysql - 登录 PhpMyAdmin 后出现错误

php - 连接后计算表中的行数

sql - 如何在加入/下推到外部服务器之前强制评估子查询

javascript - PHP 如何刷新 HTML 代码中的 ProgressBar?

php - Symfony2 和 Doctrine2 : No identifier/primary key specified for Entity "X". 每个实体必须有一个标识符/主键

mysql - 查询给出不良结果

SQL NULL 条件

javascript - 使用 javascript symfony 获取存储库