【发布时间】:2013-01-09 01:07:57
【问题描述】:
我在 PostgreSQL 中有如下查询:
UPDATE
queue
SET
queue.status = 'PROCESSING'
WHERE
queue.status = 'WAITING' AND
queue.id = (SELECT id FROM queue WHERE STATUS = 'WAITING' LIMIT 1 )
RETURNING
queue.id
许多工作人员试图一次处理一项工作(这就是为什么我有限制为 1 的子查询)。在此更新之后,每个工作人员都会获取有关 id 的信息并处理工作,但有时他们会获取相同的工作并处理两次或更多次。隔离级别为已提交读。
我的问题是我如何保证一件作品会被处理一次?我知道那里有很多帖子,但我可以说我已经尝试了其中的大部分但没有帮助();
- 我尝试了 SELECT FOR UPDATE,但它导致了死锁的情况。
- 我试过 pg_try_advisory_xact_lock,但它导致 out of shared memory
- 我尝试将
AND pg_try_advisory_xact_lock(queue.id)添加到外部查询的 WHERE 子句中,但是... [?]
任何帮助将不胜感激。
【问题讨论】:
-
您可能希望使用 PostgreSQL 9.1 中引入的新
serializable隔离级别:wiki.postgresql.org/wiki/Serializable 和 drkp.net/papers/ssi-vldb12.pdf
标签: postgresql concurrency worker-process