我在 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,但它导致共享内存不足
- 我尝试添加
AND pg_try_advisory_xact_lock(queue.id)
到外部查询的 WHERE 子句,但是... [?]
任何帮助,将不胜感激。