如何解决选择跳过锁定的更新不起作用
我有一个用例,其中多个实例从数据库读取数据并调用外部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引擎
解决方法
SELECT
和COMMIT
之间需要多长时间?我不应该超过几秒钟。
闻起来像排队机制吗?而且您要在COMMITting
之前的内部交易中选择10个项目?
如果每个项目的处理时间少于一秒钟,那么一次10个可能是合理的。但是,如果每个项目花费的时间都超过一秒钟,则一次只能选择一个。
此外,如果某项花费了超过10秒的时间,则在处理该事务时不要挂在事务上。设计其他机制来“获取”和“释放”该项目。
一种方法涉及让UPDATE
“选择”项目,并且将您的进程ID分配给列。但是让UPDATE
和“取消选择” UPDATE
处于独立的事务中,而不依赖于实际处理。 (每项3笔交易)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。