我想一次完成以下工作:

SELECT * FROM jobs WHERE status='PENDING';
UPDATE jobs SET status='RUNNING' WHERE status='PENDING';

因此,获取所有挂起的作业(job),然后立即将它们设置为"正在运行".

我不想在两个语句中一个接一个地执行此操作的原因是,作业(job)可以在SELECT之后、但在更新之前作为"挂起"添加到jobs表中,因此我最终会将作业(job)设置为正在运行,即使它处于挂起状态时我没有抓取它.

有没有办法一次完成?所以我希望SELECT的结果和更新能够实时进行.

谢谢

推荐答案

一般来说,您应该使用一条UPDATE语句来完成.在UPDATE语句运行时,更新通常不会受到可能已更改的行的影响,但是,最好读取事务隔离级别here.

假设您使用的是Read Committed的默认设置,下面是它的说明:

Read Committed是PostgreSQL中的默认隔离级别.当

关于更新:

更新、删除、 Select 更新和 Select 共享命令

因此,在您的场景中,一次更新就可以了.

还要记住,有一个SELECT FOR UPDATE语句,它会锁定您 Select 的行.你可以读到这here条.

  1. 执行SELECT以确定XYZ房间是否可在X日预订.
  2. 房间空着.执行UPDATE查询以预订房间.

你看到这里潜在的问题了吗?如果在第1步和第2步之间,房间被另一笔交易预订,那么当we到达第2步时,我们的操作假设不再有效,即房间可用.

但是,如果在步骤1中使用SELECT FOR UPDATE语句,我们将确保没有其他事务可以锁定该行,因此当我们要更新该行时,我们知道这样做是安全的.

但是,在您的场景中,不需要这个SELECT FOR UPDATE,因为您在一条语句中完成了所有操作,并且没有提前判断任何内容.

Postgresql相关问答推荐

包含JSONB属性的过滤器的索引策略

Org.postgresql.util.PSQLException:错误:函数LOWER(BYTEA)不存在

正在应用序列化迁移,但数据库没有更改

如何在PostgreSQL中以行值的形式获取列

使用jOOQ在postgres上取消嵌套enum_range

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

为什么这里的默认格式不同? (ISO 8601 的两种不同实现)

当我写 SELECT ~1;在 Postgresql 上它给了我 -2 结果.这是什么原因?它一直持续〜4和-5等

如何将 grafana 与 Google Cloud SQL 集成

将数组插入 Postgresql 数据库

如何在 PSQL 中查找从另一个表继承的子表

在 to_tsquery 中转义特殊字符

带有初始数据的 docker postgres 不会在提交中持久化

在psql中,为什么有些命令没有效果?

PostgreSQL 可以对数组元素有唯一性约束吗?

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

如果 Column1 不为空,则按 Column1 排序,否则按 Column2 排序

在 PostgreSQL 数组中查找值的位置

使用 cte (postgresql) 的结果更新

如何使用 postgresql 按计数排序?