我有5+同時從同一個mysql表中選擇行。每個進程選擇100行,處理它並刪除選定的行。
如何在Mysql中原子選擇行?
但是我得到了同樣的行選擇和處理2次或更多。
如何避免它發生在MYSQL端或Ruby on Rails端?
這個應用程序是建立在Ruby on Rails的...
我有5+同時從同一個mysql表中選擇行。每個進程選擇100行,處理它並刪除選定的行。
如何在Mysql中原子選擇行?
但是我得到了同樣的行選擇和處理2次或更多。
如何避免它發生在MYSQL端或Ruby on Rails端?
這個應用程序是建立在Ruby on Rails的...
你的表似乎是一個工作流程,這意味着你必須有一個字段表示狀態(在你的情況下「聲稱」)。其他進程應該選擇未聲明的行,這將防止進程踩在彼此的行上。
如果你想採取了一步,你可以使用的進程標識符,讓你知道什麼是什麼工作,也許多久過長是工作,以及是否它的完成,等
是的,回到你的舊問題,並批准一些答案。我看到至少有一個你肯定錯過了。
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(或刪除它)。
這會停止同一行被多個進程同時處理。您需要主機名,因爲您可能有多個主機正在處理。
如果進程在處理批處理時崩潰,可以檢查「鎖定時間」列是否非常舊(比處理可能需要的時間要早幾個小時)。然後你可以回收一些具有舊的「鎖定時間」的行,儘管它們的鎖定主機不爲空。
這是數據庫中相當常見的「隊列模式」它並不是非常有效。如果您的項目進入/離開隊列的比率非常高,請考慮使用適當的隊列服務器。