PostgreSQL临时表作用域及并发场景验证问题
问题解答
关于临时表的独立性
是的,每个执行该查询的会话都会拥有独立的临时表副本,彼此完全互不干扰。
PostgreSQL的临时表是严格会话隔离的:
- 每个数据库连接(会话)创建的临时表仅对当前会话可见,其他会话无法访问。
- 即使多个会话创建同名的临时表(比如都是
temp1),PostgreSQL会在后台为每个会话的临时表分配唯一的内部标识,它们本质上是不同的数据库对象,不会互相覆盖或影响。
你提到的场景(20个用户同时请求网页,服务器为每个请求执行该查询)中,每个请求对应的数据库会话都会创建自己的temp1临时表,各自的表数据、结构完全独立,不会出现数据混淆或冲突。
另外,你的示例SQL没有使用ON COMMIT DROP,所以这些临时表会在会话结束时自动销毁,而不是事务结束时。
用pgAdmin4测试的步骤
- 打开pgAdmin4并连接到目标PostgreSQL数据库。
- 打开第一个查询工具窗口(这是第一个独立会话):
- 执行你提供的创建临时表的SQL:
CREATE TEMP TABLE temp1 AS SELECT dataid , register_type , timestamp_localtime , read_value_avg FROM rawdata.egauge WHERE register_type LIKE '%gen%' ORDER BY dataid, timestamp_localtime; - 插入一条自定义测试数据:
INSERT INTO temp1 (dataid) VALUES (9999); - 查询验证数据存在:
SELECT * FROM temp1 WHERE dataid = 9999;
- 执行你提供的创建临时表的SQL:
- 打开第二个查询工具窗口(这是第二个独立会话):
- 同样执行创建临时表的SQL。
- 执行相同的查询语句:
你会发现查询结果为空,说明第二个会话的SELECT * FROM temp1 WHERE dataid = 9999;temp1和第一个会话的完全独立,看不到对方插入的数据。
- 测试会话销毁后的临时表状态:
- 关闭第一个查询工具窗口(结束第一个会话)。
- 打开新的查询工具窗口,尝试查询
temp1:
会收到SELECT * FROM temp1;relation "temp1" does not exist的错误,证明原会话结束后临时表已被销毁。
内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL
相关产品推荐
相关产品推荐

