sql - 在 Postgres 中设置事务回滚的默认值
问题描述
如果事务回滚,是否可以将表行字段设置为某个默认值?
考虑一个场景,对于表中的每一行都运行一个任务,它应该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;
推荐阅读
- php - 我应该在发送 html 电子邮件时链接到图像还是使用`AddEmbeddedImage`?
- google-apps-script - 将单元格中的日期与日期范围进行比较
- vhdl - Kintex7 FPGA 上输入时钟的最佳路径
- python - 如何从 TS 视频流中截屏?
- python - 导入 wxPython 会弹出错误
- hibernate - 使用 Spring Data JPA 从数据库中仅选择两个字段
- google-sheets - 需要帮助在谷歌工作表仪表板中使用嵌套或多个 ARRAYFORMULA
- node.js - Node.js Gulp src/dest 4.0 行为与 Gulp 3.6
- numpy - numpy 的 3D 数组的指数
- ansible - ansible:'dict object'没有属性'port'