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”功能来安全地抓取和处理每一行,如果处理失败,该行将以其原始状态返回到表中以进行重新处理。
但是我需要某种“尝试”功能,以便反复失败的任务行不会继续被无限处理。
我正在阅读有关“回滚到保存点”的信息,我想知道在处理失败且事务回滚的情况下,可以使用任何方法来增加“尝试”表列吗?
答案 0 :(得分:1)
好的。在SELECT ... FOR UPDATE
之后设置保存点。
如果处理失败,请回滚到保存点,递增attempts
并提交。