2013-07-07 32 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中的作業時。

在可序列化隔離級別中執行此事務