我想使用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 :(得分: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作为锁定值