说我正在使用postgres进行排队。意思是我有一个像这样的表:
table_jobs:
-id
-name
-taskId
-created_date
-status (open, processing, completed)
因此会有多个进程读取此表,并且需要锁定每一行。有没有办法防止并发问题,即多个进程读取表并拥有已经采取的作业?
答案 0 :(得分:0)
有SELECT ... FOR UPDATE
feature:
FOR UPDATE会导致SELECT语句检索到的行被锁定,就像更新一样。这可以防止其他事务修改或删除它们,直到当前事务结束。也就是说,在当前事务结束之前,将阻止尝试UPDATE,DELETE或SELECT FOR UPDATE这些行的其他事务。
实现队列的一种可能方法是:
SELECT ... WHERE status = 'open' FOR UPDATE
。UPDATE ... WHERE id IN (...)
。completed
。