首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正在锁定更新中的'select‘...from select - postgresql

正在锁定更新中的'select‘...from select - postgresql
EN

Stack Overflow用户
提问于 2021-07-22 01:56:13
回答 1查看 19关注 0票数 1

我有一些继承的代码,如下所示:

代码语言:javascript
运行
复制
const sql = `UPDATE fqdn SET lock = $1
                    FROM (SELECT id FROM fqdn WHERE region = $2 AND lock IS NULL AND expires < $3 OR lock = $1 LIMIT $4) AS expired
                    WHERE fqdn.id = expired.id
                    RETURNING fqdn.id, fqdn.config, fqdn.data`;

有多个微服务在同一数据库上运行该查询。创建者的想法是使用一个锁定字段锁定每个微服务要处理的一批行,该锁定字段是运行微服务的机器的fqdn ($1 => fqdn)。

不过,看起来有时两个微服务可能会在同一批处理上结束。有没有办法序列化它,使并发的第二个线程只在第一个线程更新完锁后才执行select?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-07-22 02:48:23

查询中确实存在竞争条件。两次并发执行可以在子查询中找到相同的行,虽然其中一个更新将阻塞,但当另一个事务完成时,它最终将继续处理。

您应该将以下内容添加到子查询中:

代码语言:javascript
运行
复制
FOR NO KEY UPDATE SKIP LOCKED

这将保证没有两个查询可以返回相同的行。

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

https://stackoverflow.com/questions/68474379

复制
相关文章

相似问题

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