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

PostgreSQL临时表作用域及并发场景验证问题

问题解答

关于临时表的独立性

是的,每个执行该查询的会话都会拥有独立的临时表副本,彼此完全互不干扰。

PostgreSQL的临时表是严格会话隔离的:

  • 每个数据库连接(会话)创建的临时表仅对当前会话可见,其他会话无法访问。
  • 即使多个会话创建同名的临时表(比如都是temp1),PostgreSQL会在后台为每个会话的临时表分配唯一的内部标识,它们本质上是不同的数据库对象,不会互相覆盖或影响。

你提到的场景(20个用户同时请求网页,服务器为每个请求执行该查询)中,每个请求对应的数据库会话都会创建自己的temp1临时表,各自的表数据、结构完全独立,不会出现数据混淆或冲突。

另外,你的示例SQL没有使用ON COMMIT DROP,所以这些临时表会在会话结束时自动销毁,而不是事务结束时。

用pgAdmin4测试的步骤

  • 打开pgAdmin4并连接到目标PostgreSQL数据库。
  • 打开第一个查询工具窗口(这是第一个独立会话):
    1. 执行你提供的创建临时表的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;
      
    2. 插入一条自定义测试数据:
      INSERT INTO temp1 (dataid) VALUES (9999);
      
    3. 查询验证数据存在:
      SELECT * FROM temp1 WHERE dataid = 9999;
      
  • 打开第二个查询工具窗口(这是第二个独立会话):
    1. 同样执行创建临时表的SQL。
    2. 执行相同的查询语句:
      SELECT * FROM temp1 WHERE dataid = 9999;
      
      你会发现查询结果为空,说明第二个会话的temp1和第一个会话的完全独立,看不到对方插入的数据。
  • 测试会话销毁后的临时表状态:
    1. 关闭第一个查询工具窗口(结束第一个会话)。
    2. 打开新的查询工具窗口,尝试查询temp1:
      SELECT * FROM temp1;
      
      会收到relation "temp1" does not exist的错误,证明原会话结束后临时表已被销毁。

内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:47:42