首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同步mysql数据库请求?

问如何同步mysql数据库请求?
EN

Stack Overflow用户
提问于 2011-02-16 16:30:48
回答 2查看 1.5K关注 0票数 1

我在一个表中有很多条目是为执行任务而获取的。这将被缩放到多个服务器。

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

目前,我通过更新表中的一个名为“j观察者”的字段来实现这一点,该字段默认为null,其id为j观察者的id。

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

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

所以我需要同步这个:

代码语言:javascript
复制
$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

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

我现在有MyIsam,我想继续使用它,因为在我的例子中,它的性能要比innodb好得多,但是我听说innodb有ACID事务。

这样我就可以将select和update作为一个整体执行。但这看上去和效果如何?

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

我也向更高级别的解决方案开放,比如共享信号量等等,问题是需要跨几个服务器进行同步。

  • 的方法一般都是明智的吗?您会这样做吗,differently?
  • how,我可以同步作业选择,以确保两个服务器不会更新相同的行吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-16 16:44:28

您可以先运行更新,但在SELECT上使用WHERE和极限。然后选择将j观察者字段设置为服务器的行。

票数 2
EN

Stack Overflow用户

发布于 2011-02-16 16:44:47

如果您无法锁定表,那么我将以不修改行为条件进行更新。类似于:

代码语言:javascript
复制
$timestamp = mysql_query("SELECT DATE_SUB(NOW(), INTERVAL 1 DAY)");

$jobs = mysql_query("
SELECT itemId 
FROM items 
WHERE 
jobserver IS NULL 
AND 
updated_at < ".$timestamp."
LIMIT 100
");

// Update only those which haven't been updated in the meantime
mysql_query("UPDATE items SET jobserver = 'current_job_server' WHERE itemId IN (".join(',',mysql_fetch_assoc($jobs)).") AND updated_at < ".$timestamp);

// Now get a list of jobs which were updated
$actual_jobs_to_do = mysql_query("
SELECT itemId
FROM items
WHERE jobserver = 'current_job_server'
");

// Continue processing, with the actual list of jobs

甚至可以组合select和update查询,如下所示:

代码语言:javascript
复制
mysql_query("
UPDATE items
SET jobserver = 'current_job_server'
WHERE jobserver IS NULL
AND updated_at < ".$timestamp."
LIMIT 100
");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5019157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档