2011-11-04 96 views
0

我有5+同時從同一個mysql表中選擇行。每個進程選擇100行,處理它並刪除選定的行。
如何在Mysql中原子選擇行?

但是我得到了同樣的行選擇和處理2次或更多。

如何避免它發生在MYSQL端或Ruby on Rails端?

這個應用程序是建立在Ruby on Rails的...

回答

4

你的表似乎是一個工作流程,這意味着你必須有一個字段表示狀態(在你的情況下「聲稱」)。其他進程應該選擇未聲明的行,這將防止進程踩在彼此的行上。

如果你想採取了一步,你可以使用的進程標識符,讓你知道什麼是什麼工作,也許多久過長是工作,以及是否它的完成,等

是的,回到你的舊問題,並批准一些答案。我看到至少有一個你肯定錯過了。

3

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' 和lockpid = 12345

在完成一個行的處理之後,您需要進行任何更新,並將lockhost,lockpid和locktime設置回NULL(或刪除它)。

這會停止同一行被多個進程同時處理。您需要主機名,因爲您可能有多個主機正在處理。

如果進程在處理批處理時崩潰,可以檢查「鎖定時間」列是否非常舊(比處理可能需要的時間要早​​幾個小時)。然後你可以回收一些具有舊的「鎖定時間」的行,儘管它們的鎖定主機不爲空。

這是數據庫中相當常見的「隊列模式」它並不是非常有效。如果您的項目進入/離開隊列的比率非常高,請考慮使用適當的隊列服務器。