在Postgres中,使用“ FOR UPDATE SKIP LOCKED”时,可以使用ROLLBACK TO SAVEPOINT来实现“尝试”吗?

时间:2018-08-23 04:47:48

标签: sql postgresql transactions

Postgres 10

我在Postgres中有一个表,其中的表行是工作队列项。辅助进程抢占一行并对其进行一些处理。

sql = """BEGIN;
UPDATE jobs SET status = 'complete'
WHERE id = (
  SELECT id
  FROM jobs
  WHERE status = 'finished_waiting'
  AND status != 'failed'
  ORDER BY created ASC 
  FOR UPDATE SKIP LOCKED
  LIMIT 1
)
RETURNING *;
"""

我现有的代码在上面。如果处理成功,则发出“ COMMIT”,如果失败,则发出“ ROLLBACK”。

我使用Postgres的“ FOR UPDATE SKIP LOCKED”功能来安全地抓取和处理每一行,如果处理失败,该行将以其原始状态返回到表中以进行重新处理。

但是我需要某种“尝试”功能,以便反复失败的任务行不会继续被无限处理。

我正在阅读有关“回滚到保存点”的信息,我想知道在处理失败且事务回滚的情况下,可以使用任何方法来增加“尝试”表列吗?

1 个答案:

答案 0 :(得分:1)

好的。在SELECT ... FOR UPDATE之后设置保存点。

如果处理失败,请回滚到保存点,递增attempts并提交。