需要MySQL锁定专业知识

时间:2013-04-26 05:37:32

标签: mysql locking queue blocking

我想使用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个未锁定的记录并继续上路。

这可行吗?

1 个答案:

答案 0 :(得分:0)

您的设计中是否可以在此表中添加字段?

如果是,则名为“locked_by”的字段默认为null将执行此操作 我假设你在完成工作时从队列表中删除条目 如果您有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客户ID,则可以执行此操作

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

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