2013-07-07 31 views
1

我有多个来源执行相同的mysql查询来获取和执行工作(来源是不同的PHP脚本)。 我想,所以我用这个查询得到有过去最远距离工作:同时选择数据和更新

SELECT * FROM jobs ORDER BY last_done ASC 

现在我的问题是,每个源应该得到独特的结果,这意味着如果一个源获取job1这份工作应该得到last_done的更新,以便它再次位于表格的底部,如果秒源执行查询,它不应得到job1,而应该得到job2等等。

我有问题,有时如果两个来源几乎在同一时间调用,他们得到同样的工作,如果我选择后单独更新。

我怎么能最好的做到这一点,而不是两个来源一起查询得到同样的工作?

+0

使用事务和锁定。 –

回答

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的细节

+0

是否这样? 'mysql_query(“START TRANSACTION”); mysql_query(“SELECT * FROM jobs ORDER BY last_done ASC”); mysql_query(“更新作业SET last_done = NOW()WHERE job_id = $ id”); mysql_query(“COMMIT”);' – maddo7

+0

mysql_query(“SET TRANSACTION ISOLATION LEVEL SERIALIZABLE”);那么你的代码如上。 – Tarik

+0

您可能必须关闭自动提交:SET autocommit = 0; – Tarik

0

你应该为此使用事务。 一个实现可以是 取和放在另一个表上的记录说job_in_progress

并且下次您可以选择不在job_in_progress中的作业时。

在可序列化隔离级别中执行此事务