脚本中恢复事务故障
来自 PostgreSQL Wiki
跳转到导航跳转到搜索
您可能需要有一部分脚本可能失败或不失败,但您希望脚本恢复并继续进行事务。此时发生故障是可以接受的。
这种情况可能是像创建表的 DDL 语句,该表可能存在也可能不存在。
SAVEPOINT
来救援,但您需要使其
ROLLBACK TO SAVEPOINT
当发生故障时,以及
RELEASE
当没有发生故障时。
一个实际示例
BEGIN;
SELECT 1;
SAVEPOINT sp;
CREATE TABLE t1 (
id bigint,
s text);
RELEASE sp;
SAVEPOINT sp;
ROLLBACK TO SAVEPOINT sp;
RELEASE sp;
SELECT * FROM t1;
COMMIT;
根据需要运行以上代码,它可以正常工作!
诀窍是,在发生故障的情况下
RELEASE sp;
SAVEPOINT sp;
来自以上片段的代码将被后端简单地忽略,因为事务处于错误状态。而当没有发生故障时,保存点将被释放,并且将执行以下操作
SAVEPOINT sp;
ROLLBACK TO SAVEPOINT sp;
RELEASE sp;
正如您很容易看到的那样,这没有做任何事情,因为子事务已打开并关闭,并且sp在之后立即被释放。
有关子事务的更多信息,请参见此处:PostgreSQL 文档
--Mcm 2010 年 6 月 20 日 00:00 (UTC)