如何在Mysql中原子选择行



我有5+同时进程选择行从同一个mysql表。每个进程选择100行,处理IT并删除选中的行。



我怎么能避免它发生在MYSQL端或Ruby on Rails端?

您的表看起来是一个工作流,这意味着您应该有一个指示行状态的字段(在您的情况下为"claimed")。其他进程应该选择未声明的行,这将防止进程踩到彼此的行。

如果你想更进一步,你可以使用进程标识符,这样你就知道什么在做什么,可能工作多长时间太长,是否已经完成,等等。

是的,回到你以前的问题并批准一些答案。我至少看到了一个你肯定错过的

Eric的回答很好,但我想我应该详细说明一下…

你的表中有一些额外的列,比如:

lockhost VARCHAR(60),
lockpid INT,
locktime INT, -- Or your favourite timestamp.

默认为NULL。

然后你让工作进程"声明"行:

UPDATE tbl SET lockhost='myhostname', lockpid=12345,
 locktime=UNIX_TIMESTAMP() WHERE lockhost IS NULL ORDER BY id
 LIMIT 100

然后用SELECT…WHERE lockhost='myhostname' and lockpid=12345

当你完成一行的处理后,你做任何必要的更新,并设置lockhost, lockpid和locktime为NULL(或删除它)。

这将阻止同一行同时被多个进程处理。您需要主机名,因为您可能有多个主机在进行处理。

如果进程在处理批处理时崩溃,您可以检查"locktime"列是否非常旧(比处理可能需要的时间长得多,例如几个小时)。然后你可以回收一些有旧"locktime"的行,即使它们的lockhost不是空的。

这是数据库中非常常见的"队列模式";它的效率不是很高。如果条目进入/离开队列的比率非常高,请考虑使用合适的队列服务器。

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

应该为你做

相关内容

  • 没有找到相关文章

最新更新