【问题标题】:In Postgres, can ROLLBACK TO SAVEPOINT be used to implement "attempts" when using "FOR UPDATE SKIP LOCKED"?在 Postgres 中,使用“FOR UPDATE SKIP LOCKED”时可以使用 ROLLBACK TO SAVEPOINT 来实现“尝试”吗?
【发布时间】: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


    【解决方案1】:

    当然。在SELECT ... FOR UPDATE 之后设置一个保存点。

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

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 2021-12-05
      • 2018-08-18
      • 2019-04-16
      • 2019-10-19
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多