我正在使用 MySQL 构建一个“穷人的排队系统”。它是一个包含需要执行的作业的表(表名为queue
)。我在多台机器上有几个进程,它们的工作是调用fetch_next2
sproc 以从队列中取出一个项目。
这个过程的重点是确保我们永远不会让 2 个客户得到相同的工作。我认为通过使用SELECT .. LIMIT 1 FOR UPDATE
将允许我锁定单行,以便我可以确定它仅由 1 个调用者更新(更新后它不再符合SELECT
用于过滤“就绪”作业的标准进行处理)。
谁能告诉我我做错了什么?我只是有一些实例,将相同的工作分配给 2 个不同的进程,所以我知道它不能正常工作。:)
CREATE DEFINER=`masteruser`@`%` PROCEDURE `fetch_next2`()
BEGIN
SET @id = (SELECT q.Id FROM queue q WHERE q.State = 'READY' LIMIT 1 FOR UPDATE);
UPDATE queue
SET State = 'PROCESSING', Attempts = Attempts + 1
WHERE Id = @id;
SELECT Id, Payload
FROM queue
WHERE Id = @id;
END