选择跳过锁定的更新不起作用

问题描述

我有一个用例,其中多个实例从数据库读取数据并调用外部API。 现在,我必须确保每个实例都读取唯一的数据。 为此,我使用跳过锁定来选择更新。

查询是获取免费的整本并对其进行处理

选择更新查询:“从abc中选择*,其中进程='NOTPICKED'顺序为updated_at desc LIMIT 10 FOR UPDATE SKIP LOCKED”

此后,我将这些条目的状态标记为“已选择” 更新查询:“更新abc设置过程='PICKED',其中hqc.customerId IN(ids)

当调试发现同一记录由多个实例处理时,我将进入LockTimeoutException运行多个实例,这意味着select for update查询未返回唯一集。

我在updated_at列上创建了一个索引。 数据库是MySQL并使用INNODB引擎

解决方法

SELECTCOMMIT之间需要多长时间?我不应该超过几秒钟。

闻起来像排队机制吗?而且您要在COMMITting之前的内部交易中选择10个项目?

如果每个项目的处理时间少于一秒钟,那么一次10个可能是合理的。但是,如果每个项目花费的时间都超过一秒钟,则一次只能选择一个。

此外,如果某项花费了超过10秒的时间,则在处理该事务时不要挂在事务上。设计其他机制来“获取”和“释放”该项目。

一种方法涉及让UPDATE“选择”项目,并且将您的进程ID分配给列。但是让UPDATE和“取消选择” UPDATE处于独立的事务中,而不依赖于实际处理。 (每项3笔交易)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...