2013-04-26 44 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