首页 > 解决方案 > 在 Postgres 中设置事务回滚的默认值

问题描述

如果事务回滚,是否可以将表行字段设置为某个默认值?

考虑一个场景,对于表中的每一行都运行一个任务,它应该state根据实际任务状态修改一个字段。所以首先任务会用 更新行state=running,然后它会开始一个事务,做一些处理并用 更新行state=complete。处理完成后,任务提交事务并且complete状态变为可见。但是,如果任务突然失败(想象一下电源故障),事务将回滚并且状态running永远保持不变。是否可以设置failed在这种情况下使用的默认值?

我对在 Postgres 中执行此操作特别感兴趣,但我很乐意了解这在任何数据库中是否可行,或者可以做些什么来达到这种效果。

编辑:

换句话说,我需要进行 2 个并发的、互斥的事务,以便如果一个失败,则另一个被提交。或者,可以将其视为具有持久保存点的两阶段事务。

标签: sqlpostgresqltransactionsrollback

解决方案


您可以使用的一件事是保存点:

START TRANSACTION;

SAVEPOINT a;

/* do some work */

UPDATE atable SET state = 'complete' WHERE ...;

COMMIT;

现在,如果出现错误,您会捕获该错误并执行

ROLLBACK TO SAVEPOINT a;

UPDATE atable SET state = 'failed' WHERE ...;

COMMIT;

推荐阅读