需要MySQL锁定专业知识吗
我想使用MySQL表作为队列,并且我想与几个使用者同时使用它。我不希望任何两个消费者从中获得相同的条目 我最初的想法是:需要MySQL锁定专业知识吗,mysql,locking,queue,blocking,Mysql,Locking,Queue,Blocking,我想使用MySQL表作为队列,并且我想与几个使用者同时使用它。我不希望任何两个消费者从中获得相同的条目 我最初的想法是: select * from queue_table order by entry_time desc limit n for update; select * from queue_table where *not already locked* order by entry_time desc limit n for update; 将为我获取下一个n条目
select *
from queue_table
order by entry_time desc
limit n for update;
select *
from queue_table
where *not already locked*
order by entry_time desc
limit n for update;
将为我获取下一个n条目并锁定它们,以便其他消费者无法获取它们。
问题在于锁被放置在表和索引项上,因此当其他使用者运行相同的查询时,它们会阻塞,直到第一个使用者完成其事务。
我不希望每个消费者都等待其他消费者完成。我需要像这样的东西:
select *
from queue_table
order by entry_time desc
limit n for update;
select *
from queue_table
where *not already locked*
order by entry_time desc
limit n for update;
这样我就可以得到下一个n个解锁的记录,然后上路了
这是否可行?在您的设计中是否可以在此表中添加字段 如果是,则一个名为“locked_by”的字段默认为null将执行此操作 我假设在作业完成时从队列表中删除条目 如果您有uniq客户ID
UPDATE queue_table
SET locked_by = CustId
WHERE locked_by is NULL
order by entry_time desc
limit n;
然后
如果您没有uniq客户id,您可以这样做
set @tempId := UUID(); ; --This wil generate a 36char uniq string
用@tempId代替CustId作为锁值我喜欢它。我唯一关心的是,如果消费程序在处理这些记录时出现问题,则解锁这些记录。特别是当消费程序由于某种原因死亡,无法自行解锁时。然后,它们被锁定,但未被处理,并且周围没有任何东西使它们再次可用。也许将locked_设置为以及locked_by和任何已处于锁定状态达X个时间的记录也是公平的游戏?