sql - 在 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”,我想知道在处理失败并且事务回滚的情况下,是否可以使用它来增加“尝试”表列?
解决方案
当然。在SELECT ... FOR UPDATE
.
如果处理失败,则回滚到保存点,递增attempts
并提交。