PostgreSQL Temp Table 的范围是什么?
What is the scope of a PostgreSQL Temp Table?
我用谷歌搜索了很多,我的阅读理解能力相当不错,但我不明白这个脚本是否可以在我的 postgres/postgis 盒子上的多个线程中运行。这是代码:
Do
$do$
DECLARE
x RECORD;
b int;
begin
create temp table geoms (id serial, geom geometry) on commit drop;
for x in select id,geom from asdf loop
truncate table geoms;
insert into geoms (geom) select someGeomfield from sometable where st_intersects(somegeomfield,x.geom);
----do something with the records in geoms here...and insert that data somewhere else
end loop;
end;
$do$
那么,如果我 运行 从 Java 调用多个客户端,geoms temp table 的范围会导致问题吗?如果是这样,在 PostGres 中解决此问题的任何想法都会有所帮助。
谢谢
PostgreSQL(或 Postgres)(PostGres 不存在)中的临时表仅是本地的,并且与创建它们的会话相关。所以没有其他会话(客户端)可以看到来自其他会话的临时表。两者(模式和数据)对其他人都是不可见的。您的代码是安全的。
你会 运行 进入一个微妙的陷阱,这就是为什么我还没有准备好声明它 "safe" 是范围是每个会话,但人们经常忘记删除 tables(所以它们在断开连接时掉线)。
我认为,如果您不需要临时 table 在您的函数之后明确地删除它,那么您的情况会好得多。这将防止在同一事务中尝试 运行 函数两次而引起的问题。 (在提交时你正在删除)
我用谷歌搜索了很多,我的阅读理解能力相当不错,但我不明白这个脚本是否可以在我的 postgres/postgis 盒子上的多个线程中运行。这是代码:
Do
$do$
DECLARE
x RECORD;
b int;
begin
create temp table geoms (id serial, geom geometry) on commit drop;
for x in select id,geom from asdf loop
truncate table geoms;
insert into geoms (geom) select someGeomfield from sometable where st_intersects(somegeomfield,x.geom);
----do something with the records in geoms here...and insert that data somewhere else
end loop;
end;
$do$
那么,如果我 运行 从 Java 调用多个客户端,geoms temp table 的范围会导致问题吗?如果是这样,在 PostGres 中解决此问题的任何想法都会有所帮助。
谢谢
PostgreSQL(或 Postgres)(PostGres 不存在)中的临时表仅是本地的,并且与创建它们的会话相关。所以没有其他会话(客户端)可以看到来自其他会话的临时表。两者(模式和数据)对其他人都是不可见的。您的代码是安全的。
你会 运行 进入一个微妙的陷阱,这就是为什么我还没有准备好声明它 "safe" 是范围是每个会话,但人们经常忘记删除 tables(所以它们在断开连接时掉线)。
我认为,如果您不需要临时 table 在您的函数之后明确地删除它,那么您的情况会好得多。这将防止在同一事务中尝试 运行 函数两次而引起的问题。 (在提交时你正在删除)