我有一个用例,其中多个实例从DB读取数据并调用外部API。现在,我必须确保每个实例读取唯一的数据。为此,我对更新使用了select,使用了跳过锁定。
查询的目的是获取空闲条目并对其进行处理
select FOR update查询:"select * from abc where process = 'NOTPICKED‘order by updated_at desc LIMIT 10 for UPDATE SKIP LOCKED“
之后,我将这些条目的状态标记为'PICKED‘更新查询:"update abc set process = 'PICKED’where hqc.customerId IN (ids)
我在运行多个实例时进入LockTimeoutException,这时debug发现相同的记录由多个实例处理,这意味着select for update查询没有返回唯一集。
我已经在updated_at列上创建了一个索引。DB是MySQL,并使用INNODB引擎
发布于 2020-08-14 05:30:06
SELECT和COMMIT之间需要多长时间?我应该不会超过几秒钟。
闻起来像是排队机制?在COMMITting之前,您在事务中挑选了10个要处理的项目
如果每个项目都可以在不到一秒的时间内处理,那么一次处理10个可能是合理的。但是,如果每个项目花费的时间超过一秒钟,则一次只挑选一个项目。
此外,如果某个项目花费的时间超过10秒,则在处理事务时不要挂起它。设计一些其他的机制来“获取”和“释放”物品。
一种方法是让UPDATE“挑选”项目,并将进程的id分配给一个列。但是将UPDATE和"unpick“UPDATE放在单独的事务中,独立于实际处理。(每项3笔交易)
https://stackoverflow.com/questions/63352639
复制相似问题