1

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

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我真正想知道的是,是否会发生两个工作人员为相同的参数(. 这是我想避免的。我期望发生的是,其中一名工人将获得所有行(如果行锁定是原子的),而另一名工人一无所获。是这样吗?

4

2 回答 2

1

如果您的两个查询同时运行,则每个查询都可以返回和删除表中的某些行。从这个意义上说,您的查询不是原子的。

您应该在数据库外部或使用 PostgreSQL咨询锁来序列化您的进程。

于 2019-09-11T11:44:48.937 回答
1

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

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

于 2019-09-11T23:34:24.177 回答