Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要MySQL锁定专业知识吗_Mysql_Locking_Queue_Blocking - Fatal编程技术网

需要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条目

我想使用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个解锁的记录,然后上路了


这是否可行?

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

如果是,则一个名为“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个时间的记录也是公平的游戏?