You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL的不同事务之间共享临时表?

在PostgreSQL中跨事务共享临时表的实现方案

1. 全局临时表(同会话多事务共享)

PostgreSQL的全局临时表支持同一会话内的多个事务共享数据,表结构对所有会话可见,但每个会话的数据集相互隔离。

创建语法

CREATE GLOBAL TEMPORARY TABLE temp_shared (
    id INT PRIMARY KEY,
    content TEXT
) ON COMMIT PRESERVE ROWS;

核心参数ON COMMIT PRESERVE ROWS:事务提交后保留表中数据,这是实现同会话跨事务共享的关键。默认的ON COMMIT DELETE ROWS会在事务结束后清空数据,无法跨事务复用。

操作示例

事务1提交数据:

BEGIN;
INSERT INTO temp_shared VALUES (1, 'sample data');
COMMIT;

同会话的事务2可直接读写:

BEGIN;
SELECT * FROM temp_shared; -- 可查询到id=1的记录
UPDATE temp_shared SET content = 'updated content' WHERE id=1;
COMMIT;

2. 普通临时表(仅同会话内跨事务)

如果不需要让其他会话看到表结构,用普通临时表搭配ON COMMIT PRESERVE ROWS即可:

CREATE TEMPORARY TABLE temp_session_only (
    id INT PRIMARY KEY,
    content TEXT
) ON COMMIT PRESERVE ROWS;

该表仅当前会话可见,数据在事务提交后留存,适合仅需同会话内跨事务共享的场景。

3. 跨会话事务共享临时数据(特殊需求)

若要不同会话的事务共享临时数据,全局临时表无法满足(数据会话隔离),可以用普通表加会话标识模拟:

CREATE TABLE cross_session_temp (
    session_pid INT,
    id INT,
    content TEXT,
    PRIMARY KEY (session_pid, id)
);
  • 用pg_backend_pid()获取当前会话进程ID,作为数据的归属标识
  • 会话间共享数据时,需指定目标会话的pid查询
  • 需自行清理过期数据(比如会话结束时删除对应记录,或定时清理)

示例:

-- 会话1插入数据
INSERT INTO cross_session_temp VALUES (pg_backend_pid(), 1, 'cross-session data');

-- 会话2查询(替换为会话1的实际pid)
SELECT * FROM cross_session_temp WHERE session_pid = 12345;

注意事项

  • 全局临时表结构会持久化在数据库中,需手动执行DROP TABLE删除;普通临时表会在会话结束时自动销毁。
  • 临时表都存储在pg_temp命名空间,查询时可明确指定pg_temp.temp_shared。
  • ON COMMIT PRESERVE ROWS不会影响事务回滚:回滚仅撤销当前事务的修改,不会清空整个表的数据。

内容的提问来源于stack exchange,提问作者Julio Marins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:22:47