如何将Postgres的“ ROLLBACK TO SAVEPOINT”和“ FOR UPDATE SKIP LOCKED”一起使用?

时间:2018-08-25 23:05:30

标签: postgresql transactions

Postgres 10

我正在尝试使用“ FOR UPDATE SKIP LOCKED”在Postgres中创建工作队列。

我的目标是通过使用“ ROLLBACK TO SAVEPOINT;”将状态设置为“完成”或“失败”。如果处理失败。

我希望下面的代码会导致最终状态为“失败”,但看来最终状态为“正在等待”。

BEGIN;
      DROP TABLE IF EXISTS foo;
      SELECT id
      INTO foo
      FROM jobs
      WHERE status = 'waiting'
      AND status != 'failed'
      ORDER BY created ASC
      FOR UPDATE SKIP LOCKED
      LIMIT 1;

    UPDATE jobs SET status = 'failed' WHERE id = (SELECT id from foo) RETURNING *;
    SAVEPOINT blah;
    UPDATE jobs SET status = 'complete' WHERE id = (SELECT id from foo) RETURNING *;


ROLLBACK TO SAVEPOINT blah;

任何人都可以建议我该怎么做才能使用COMMIT来使状态“完成”或回滚到保存状态等等以使状态“失败”吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

看来您根本没有承诺,所以从外面看,直到您这样做都看不到任何变化。