【发布时间】:2019-01-29 09:38:37
【问题描述】:
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”的内容,我想知道在处理失败并且事务回滚的情况下,是否可以使用它来增加“尝试”表列?
【问题讨论】:
标签: sql postgresql transactions