如何在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
相关产品推荐
相关产品推荐

