多个进程正在从表中读取以获取作业

时间:2016-12-19 19:43:28

标签: postgresql

说我正在使用postgres进行排队。意思是我有一个像这样的表:

table_jobs:
 -id
 -name
 -taskId
 -created_date
 -status (open, processing, completed)

因此会有多个进程读取此表,并且需要锁定每一行。有没有办法防止并发问题,即多个进程读取表并拥有已经采取的作业?

1 个答案:

答案 0 :(得分:0)

SELECT ... FOR UPDATE feature

  

FOR UPDATE会导致SELECT语句检索到的行被锁定,就像更新一样。这可以防止其他事务修改或删除它们,直到当前事务结束。也就是说,在当前事务结束之前,将阻止尝试UPDATE,DELETE或SELECT FOR UPDATE这些行的其他事务。

实现队列的一种可能方法是:

  1. 工作进程运行SELECT ... WHERE status = 'open' FOR UPDATE
  2. 工作进程使用从上一步获得的ID运行UPDATE ... WHERE id IN (...)
  3. 工人流程可以做到这一点。
  4. 工作进程将任务状态更新为completed