MySQL-8.0.11“ ... LIMIT 1 FOR UPDATE SKIP LOCKED”不适用于多种排序吗?

时间:2019-02-17 10:10:55

标签: mysql multithreading

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

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

....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;

0 个答案:

没有答案