mysql - 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;
解决方案
推荐阅读
- tableau-api - 我可以在一个计算字段中进行多项计算吗?
- r - How to use Rvest to scrape data
- java - Java tomcat线程内存使用限制
- android - React Native 不使用 Android Studio 链接模块
- swift - 将模型保存到 Userdefaults 会使应用程序迅速崩溃
- android - 如何调查为什么 gradle build 使用缓存的资源 ID
- java - Spring preAuthorize SpEL查询的日志结果?
- java - 压缩机是抽象的;无法实例化
- ios - Xcode 找不到任何与“应用程序名称”匹配的 iOS 应用程序开发配置文件
- java - 如何修复异常:getOutputStream() 已为此响应调用?