首页 > 解决方案 > 在 Postgres 中,使用“FOR UPDATE SKIP LOCKED”时可以使用 ROLLBACK TO SAVEPOINT 来实现“尝试”吗?

问题描述

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”特性来安全地抓取和处理每一行,如果处理失败,该行将以其原始状态返回到表中进行重新处理。

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

我正在阅读“ROLLBACK TO SAVEPOINT”,我想知道在处理失败并且事务回滚的情况下,是否可以使用它来增加“尝试”表列?

标签: sqlpostgresqltransactions

解决方案


当然。在SELECT ... FOR UPDATE.

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


推荐阅读