0

我想将 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;

这样我就可以得到下一个未锁定的记录并继续前进。

这是可行的吗?

4

1 回答 1

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

如果您没有唯一的客户 ID,您可以这样做

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

thein 而不是 CustId 使用 @tempId 作为锁定值

于 2013-04-26T05:55:59.643 回答