PostgreSQL 中的行级锁定是原子的吗?

Is row level locking atomic in PostgreSQL?

我在 PostgreSQL 中有一个 table,我想将其视为一个队列。我有一些选择标准,我用它来锁定然后从 table 中删除行,如下所示:

DELETE FROM queue
WHERE itemid = (
  SELECT itemid
  FROM queue
  ORDER BY itemid
  WHERE some_column='some value'
  FOR UPDATE SKIP LOCKED
)
RETURNING *;

行锁定在 PostgreSQL 中如何工作?当执行 SELECT 查询时,它会自动锁定所有匹配的行吗?我问这个是因为分组对我来说很重要,我想处理同一工作人员中 some_column='some value' 的所有行。

澄清:我真正想知道的是,两个工作人员是否会针对相同的参数执行相同的查询(上面的查询)(some value) 其中一个锁定几行以进行更新,另一个工作人员拿起其余的行。这是我想避免的。我期望发生的是其中一名工人将获得所有行(如果行锁定是原子的)而另一名工人什么也得不到。是这样吗?

如果您的两个查询同时 运行,则每个查询都可以 return 并删除 table 中的一些行。从这个意义上说,您的查询不是原子的。

您应该在数据库外部或使用 PostgreSQL 序列化您的进程 advisory locks

由于您正在处理排队 table,请务必查看 SKIP LOCK:

https://www.2ndquadrant.com/en/blog/what-is-select-skip-locked-for-in-postgresql-9-5/