1

我有多个来源执行相同的 mysql 查询来获取和执行一项工作(来源是不同的 php 脚本)。我想得到与过去最远的工作,所以我使用这个查询:

SELECT * FROM jobs ORDER BY last_done ASC

现在我的问题是每个来源都应该得到唯一的结果,这意味着如果一个来源得到job1这个工作应该更新到 last_done 所以它再次位于表的底部,如果第二个来源执行它不应该得到的查询job1,而是它应该得到job2等等。

我遇到的问题是,如果我在选择后单独更新,有时如果 2 个源几乎同时调用它们会获得相同的工作。

我怎样才能最好地做到这一点,而不是 2 个靠近查询的来源获得相同的工作?

4

2 回答 2

1

1 - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 2 - 在单个事务中执行选择和更新。

注意:SERIALIZABLE 隔离级别可能有点过头了,详情请查看https://en.wikipedia.org/wiki/Isolation_(database_systems)http://msdn.microsoft.com/en-us/library/ms173763.aspx

于 2013-07-07T16:29:52.477 回答
0

您应该为此使用事务。一个实现可以获取并将记录放在另一个表上说job_in_progress

下次你可以选择不在的工作job_in_progress

以可序列化的隔离级别执行此事务

于 2013-07-07T16:31:47.000 回答