如何解决嵌套的 SQL 查询是原子的吗?
我有一些微服务(几乎)系统,其中每个程序都有自己的端口。此外,并非系统中的所有端口都可用。为简单起见,我决定在 PostgreSQL 的表中保留一个空闲端口列表。因此,我有这张表:
service | port
-------------------
sm_srv | 5600
null | 5601
...
分别是,如果service列的值为null,则端口空闲,否则忙。 但是,如果您首先选择所有空闲端口,然后占用其中一个,则操作变得非原子性是合乎逻辑的。这可能会导致两个服务尝试占用同一个端口的情况。
我试图使这个操作原子化。为此,我决定不选择,而是立即更新。但是,在这里我遇到了缺乏 SQL 知识的问题,并且无法在 Internet 上找到有关此主题的任何信息。我的最终要求:
UPDATE table
SET service='asd'
WHERE port IN (SELECT port FROM table WHERE service IS NULL LIMIT 1)
RETURNING port;
问题:这样的操作是原子操作吗?或者我可以以某种方式使我需要的东西更容易?
解决方法
您应该编写子查询,以便它针对并发修改锁定找到的行:
UPDATE services
SET service='asd'
WHERE port IN (SELECT port
FROM services
WHERE service IS NULL
FOR UPDATE SKIP LOCKED
LIMIT 1)
RETURNING port;
SKIP LOCKED
会导致查询忽略锁定的行,而不是在锁定后等待。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。