我在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
(执行相同的查询(上面的查询(,其中一个锁定几行进行更新,另一个工作线程拾取其余的。这就是我想避免的。我期望发生的事情是,其中一个工作线程将获得所有行(如果行锁定是原子的(,而另一个工作线程什么也得不到。是这样吗?
如果两个查询同时运行,则每个查询都可以返回和删除表中的某些行。从这个意义上说,您的查询不是原子的。
您应该在数据库外部或使用 PostgreSQL 咨询锁序列化进程。
由于您正在处理排队表,请务必查看跳过锁定:
https://www.2ndquadrant.com/en/blog/what-is-select-skip-locked-for-in-postgresql-9-5/