首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Select for update for skip locked不起作用

Select for update for skip locked不起作用
EN

Stack Overflow用户
提问于 2020-08-11 14:28:06
回答 1查看 220关注 0票数 1

我有一个用例,其中多个实例从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引擎

EN

回答 1

Stack Overflow用户

发布于 2020-08-14 05:30:06

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

闻起来像是排队机制?在COMMITting之前,您在事务中挑选了10个要处理的项目

如果每个项目都可以在不到一秒的时间内处理,那么一次处理10个可能是合理的。但是,如果每个项目花费的时间超过一秒钟,则一次只挑选一个项目。

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

一种方法是让UPDATE“挑选”项目,并将进程的id分配给一个列。但是将UPDATE和"unpick“UPDATE放在单独的事务中,独立于实际处理。(每项3笔交易)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63352639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档