长期工作& sql事务

时间:2015-12-23 20:20:19

标签: php mysql pdo transactions

假设我有一个包含机器人数据的表,其中一列是机器人的当前自治权。我有一个节点作业,每分钟调用一个PHP脚本,应该选择所有未充满电的机器人(“ current_autonomy< max_autonomy ”),然后更新它们一定数量(来自数据库也是如此。

为此,我启动了一项交易,选择了所有需要更新的机器人,然后我浏览它们(“ foreach ”)并执行“更新 “查询。我不是只做一个大的“ UPDATE ”,因为如果“ current_autonomy + reload> max_autonomy允许”,则应该在“ max_autonomy_allowed”上设置自治权。 “并且不会增加” reload “(为了避免当前的自主权高于允许的最大值)。

它工作得很好,但我认为当我在数据库中有大量记录时,它可能会导致一些问题。实际上,假设存在大量数据并且脚本需要10秒才能执行。另请注意,机器人“X”已被选中,因为它具有“90/100”的自主权。然后foreach开始,机器人开始更新。

现在,假设在脚本更新机器人“X”之前,拥有它的玩家会做出一个应该将其自治权降低2的动作。动作查询是否会等到作业的脚本完成之后(因为表锁定?)?如果没有,这是否意味着自治将减少,然后由脚本更新?因为如果是这种情况,当作业的“ SELECT ”选择了机器人数据时,它选择“90”作为当前的自治权,当它更新这个值时,它会做“90” +重新加载“而不是”88 +重新加载“,所以它就像玩家没有支付他的最后一个动作。

我不知道我是否非常清楚,如果你不理解,请向我询问更多详情,因为我对这个问题非常感兴趣(数字......)。

问题是我阅读了很多文章/帖子(包括这一篇:PDO Transactions Locks?),有些人说“使用交易来处理所有事情”,而其他人则说“只要你确定你就使用它们”绝对需要他们“。

现在,我的所有请求都被包装到一个事务中,甚至原子选择或插入,我正在考虑改变它以便仅在真正需要时才使用事务,但我读了一篇文章说“如果你不知道”知道你是否应该使用交易,然后使用它“,所以我有点迷失。

一般信息:我的项目是一个由查询执行某些操作的页面组成的游戏。还有一些节点js cron作业调用一些PHP脚本来执行预定的操作(例如更新机器人自治或在满足某些条件时向玩家发送邮件等等)并且我希望它是最有效的可能。我真正不想要的是,如果有很多用户只是因为事务在任何地方锁定表,网站变得特别慢。

感谢您的回答

1 个答案:

答案 0 :(得分:1)

为了减轻负担,您可以使用InnoDB存储引擎来实现MySQL或任何其他实现行锁定而不是表锁定的数据库表提供程序。

除此之外,您有2个选择。 重构您的基础架构或向服务器添加更多资源以应对缓慢。你可以做的只有那么多的优化。