首页 > 解决方案 > MySQL-8.0.11 "...LIMIT 1 FOR UPDATE SKIP LOCKED" 不适用于多种排序?

问题描述

我有一个带有任务队列的表。每个任务都可以具有“新”或“就绪”状态。

我使用了几个线程,每个线程都应该执行一个“新”任务,并在一段时间后将其更新为“完成”任务。每个线程都使用这个请求:

....WHERE `status` = 'new' ORDER BY `service` LIMIT 1 FOR UPDATE SKIP LOCKED

它有效。但是,如果我再添加 1 个排序条件,则来自第一个线程的查询会按预期返回一条记录,但其他线程会得到一个空结果。看起来第二个排序条件锁定了表中的所有记录。如何解决这个问题?感谢

重现步骤:

CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`service` varchar(32) NOT NULL,
`address` varchar(32) NOT NULL,
`status` enum('new','done') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `test` (`id`, `service`, `adders`, `status`) VALUES
(1, 'service_1', 'adders_1', 'new'),
(2, 'service_2', 'adders_2', 'new');

每个线程的请求:

BEGIN;
SELECT * FROM `test` WHERE `status` = 'new' 
ORDER BY  `service`, `address` LIMIT 1 FOR UPDATE SKIP LOCKED

然后像 sleep() 一样暂停。然后

UPDATE `test`  SET.....

然后

COMMIT;

标签: mysqlmultithreading

解决方案


推荐阅读