2013-04-26 55 views
0

我想使用MySQL表作爲隊列,並且我想將它與多個使用者同時使用。我不希望任何兩個消費者從中獲得相同的條目。需要MySQL鎖定專業知識

本來我以爲是這樣的:

select * 
from queue_table 
order by entry_time desc 
limit n for update; 

會得到我下N個項目,並鎖定他們,讓其他消費者無法得到它們。 問題在於鎖放置在表和索引條目上,以便當其他使用者運行相同的查詢時,它們會阻塞,直到第一位消費者完成其事務。 我不希望每個消費者都等待其他人完成。我需要這樣的東西:

select * 
from queue_table 
where *not already locked* 
order by entry_time desc 
limit n for update; 

這樣我就可以得到下n個解鎖的記錄,並在我的路上。

這是可行的嗎?

回答

0

是否可以在您的設計中在此表中添加字段?

如果有一個名爲「locked_by」默認爲空場會做的伎倆 我假設你從你的隊列表中刪除條目時的工作已經完成 如果你有一個uniq的CUSTID

UPDATE queue_table 
SET locked_by = CustId 
WHERE locked_by is NULL 
order by entry_time desc 
limit n; 

然後

SELECT * FROM queue_table 
where locked_by = "CustId" 
order by entry_time 

如果沒有uniq的custumer ID,你可以做到這一點

set @tempId := UUID(); ; --This wil generate a 36char uniq string 

thein代替custId使用@tempId作爲鎖定值

+0

我喜歡它。我唯一擔心的是如果消費程序在處理它們時出現問題,請解鎖這些記錄。特別是如果消費程序由於某種原因死亡並且不能單獨解鎖它們。然後他們被鎖定,但未經處理,沒有任何東西可以再次使用。也許設置一個locked_at與locked_by以及任何處於鎖定狀態X的時間的記錄也是公平的遊戲? – user1793034 2013-04-26 16:09:15