如果事务回滚,是否可以将表行字段设置为某个默认值?
考虑一种情况,其中对于表中的每一行都运行一个任务,该任务应根据实际任务状态修改state
字段。因此,首先该任务将使用state=running
更新该行,然后它将开始一个事务,进行一些处理并使用state=complete
更新该行。处理完成后,任务将提交事务,并且complete
状态变为可见。但是,如果任务突然失败(想象中的电源故障),则事务将回滚,并且状态永远保持为running
。是否可以设置在这种情况下将使用的默认值,例如failed
?
我对在Postgres中执行此操作特别感兴趣,但我很高兴了解在任何数据库中是否可以做到这一点,或者可以做些什么来达到这种效果。
编辑:换句话说,我需要进行2个并发的,互斥的事务,以便如果其中一个失败,则提交另一个事务。或者,可以将其视为具有持久保存点的两阶段事务。
您可以使用的一件事是保存点:
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;