pg_statement_rollback

在服务端提供类似Oracle/DB2的语句级回滚能力

概览

扩展包名版本分类许可证语言
pg_statement_rollback1.5SIMISCC
ID扩展名BinLibLoadCreateTrustReloc模式
9130pg_statement_rollback-
相关扩展oracle_fdw orafce pgtt session_variable safeupdate pg_dbms_metadata pg_dbms_lock pg_hint_plan

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.51817161514pg_statement_rollback-
RPMPGDG1.51817161514pg_statement_rollback_$v-
DEBPIGSTY1.51817161514postgresql-$v-pg-statement-rollback-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PGDG 1.5
PGDG 1.4
PGDG 1.4
el8.aarch64
PGDG 1.5
PGDG 1.4
PGDG 1.4
el9.x86_64
PGDG 1.5
PGDG 1.4
PGDG 1.4
PGDG 1.4
el9.aarch64
PGDG 1.5
PGDG 1.4
PGDG 1.4
el10.x86_64
PGDG 1.5
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
el10.aarch64
PGDG 1.5
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d12.x86_64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
d12.aarch64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
d13.x86_64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
d13.aarch64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
u22.x86_64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
u22.aarch64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
u24.x86_64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
u24.aarch64
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5
PIGSTY 1.5

构建

您可以使用 pig build 命令构建 pg_statement_rollback 扩展的 DEB 包:

pig build pkg pg_statement_rollback         # 构建 DEB 包

安装

您可以直接安装 pg_statement_rollback 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_statement_rollback;          # 当前活跃 PG 版本安装
pig ext install -y pg_statement_rollback -v 18  # PG 18
pig ext install -y pg_statement_rollback -v 17  # PG 17
pig ext install -y pg_statement_rollback -v 16  # PG 16
pig ext install -y pg_statement_rollback -v 15  # PG 15
pig ext install -y pg_statement_rollback -v 14  # PG 14
dnf install -y pg_statement_rollback_18       # PG 18
dnf install -y pg_statement_rollback_17       # PG 17
dnf install -y pg_statement_rollback_16       # PG 16
dnf install -y pg_statement_rollback_15       # PG 15
dnf install -y pg_statement_rollback_14       # PG 14
apt install -y postgresql-18-pg-statement-rollback   # PG 18
apt install -y postgresql-17-pg-statement-rollback   # PG 17
apt install -y postgresql-16-pg-statement-rollback   # PG 16
apt install -y postgresql-15-pg-statement-rollback   # PG 15
apt install -y postgresql-14-pg-statement-rollback   # PG 14

预加载配置

shared_preload_libraries = 'pg_statement_rollback';

用法

pg_statement_rollback: 类似 Oracle 或 DB2 的 PostgreSQL 语句级服务器端回滚

在每条语句之前自动创建服务器端保存点,允许单条语句失败而不中止整个事务。

启用

LOAD 'pg_statement_rollback.so';
SET pg_statement_rollback.enabled TO on;

或在 postgresql.conf 中为所有会话启用:

session_preload_libraries = 'pg_statement_rollback'
pg_statement_rollback.enabled = on

基本用法

BEGIN;
CREATE TABLE test(id integer);
INSERT INTO test SELECT 1;
SELECT COUNT(*) FROM test;         -- 返回 1

INSERT INTO test SELECT 'wrong';   -- ERROR: invalid input syntax
ROLLBACK TO SAVEPOINT "PgSLRAutoSvpt";  -- 仅回滚失败的语句

SELECT COUNT(*) FROM test;         -- 仍然返回 1
COMMIT;

没有此扩展,错误会中止整个事务,后续所有语句都会以 “current transaction is aborted” 失败。

配置

-- 随时在会话中启用/禁用
SET pg_statement_rollback.enabled TO off;

-- 更改保存点名称(仅超级用户)
SET pg_statement_rollback.savepoint_name TO 'my_savepoint';

-- 将保存点限制为仅写操作语句(默认:on)
SET pg_statement_rollback.enable_writeonly TO off;

关键行为

  • 以最小性能开销在服务器端自动创建保存点
  • 默认仅在写语句(INSERT、UPDATE、DELETE 等)后创建保存点
  • enable_writeonly 开启时,SELECT 语句不会触发自动保存点
  • 客户端在处理错误时仍需调用 ROLLBACK TO SAVEPOINT "PgSLRAutoSvpt"

最后修改 2026-03-14: update extension metadata (953cbd0)