gpt4 book ai didi

php - 如何同步mysql数据库请求?

转载 作者:行者123 更新时间:2023-11-29 05:43:01 24 4
gpt4 key购买 nike

我在一个表中有很多条目是为执行作业而获取的。这被扩展到多个服务器。

当一个服务器获取一堆行以添加到它自己的作业队列时,它们应该被“锁定”以便没有其他服务器获取它们。当执行更新时,时间戳增加并且它们被“解锁”。

我目前通过更新表中名为“jobserver”的字段来执行此操作,该字段默认为 null,带有 jobserver 的 id。

作业服务器只选择字段为空的行。

当所有行都被处理后,它们的时间戳被更新,最后作业字段再次设置为空。

所以我需要同步这个:

$jobs = mysql_query("
SELECT itemId
FROM items
WHERE
jobserver IS NULL
AND
DATE_ADD(updated_at, INTERVAL 1 DAY) < NOW()
LIMIT 100
");

mysql_query("UPDATE items SET jobserver = 'current_job_server' WHERE itemId IN (".join(',',mysql_fetch_assoc($jobs)).")");

// do the update process in foreach loop
// update updated_at for each item and set jobserver to null

每台服务器都在无限循环中执行上述操作。如果没有返回任何字段,则所有内容都是最新的 2 日期(最后一次更新不超过 24 小时)并发送到 10 分钟。

我目前有 MyIsam,我想继续使用它,因为在我的情况下它的性能比 innodb 好得多,但我听说 innodb 有 ACID 事务。

所以我可以同时执行选择和更新。但它看起来和工作起来如何?

问题是我不能锁定表或其他东西,因为其他进程需要读/写并且不能被锁定。

我也对共享信号量等更高级别的解决方案持开放态度。问题是同步需要跨多个服务器。

  • 这种方法总体上是否合理?你会采取不同的做法吗?

  • 我如何同步作业 selectino 以确保两台服务器不会更新相同的行?

最佳答案

您可以先运行 UPDATE,但使用 SELECT 上的 WHERE 和 LIMIT。然后,您选择将 jobserver 字段设置为您的服务器的行。

关于php - 如何同步mysql数据库请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5019157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com