我有一个带有任务队列的表。 每个任务的状态都可以为“新”或“就绪”。
我使用了多个线程,每个线程都应该执行一个“新”任务,并在一段时间后将其更新为“完成”的任务。 每个线程都使用此请求:
....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;