栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

临时表的Postgresql线程安全

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

临时表的Postgresql线程安全

临时表对于同一会话中的所有操作都是可见的。因此,在删除存在的临时表之前(在您的情况下提交事务),您 无法 在同一会话中 创建同名的临时表。

您可能要使用:

CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

有关

CREATETABLE
手册的更多信息。


唯一的临时表

为了使临时表在每个“线程”中处于本地(在同一会话中),您需要使用 唯一的表名 。一种方法是使用无限制的

SEQUENCE
动态SQL-
以过程语言(如plpgsql)或DO语句(基本上相同,但不存储函数)使用。

运行一:

CREATE SEQUENCE myseq;

用:

DO $$BEGINEXECUTE 'CREATE TABLE tmp' || nextval('myseq')  ||'(id int)';END;$$

要知道最新的表名:

SELECt 'tmp' || currval('myseq');

或者将它们全部放入plpgsql函数中并返回表或重用表名。

但是,由于普通的SQL语句使用硬编码的标识符运行,因此所有其他SQL命令都必须动态执行。因此,最好将它们全部放入plpgsql函数中。


使用相同临时表的唯一ID

另一种可能的解决方案是对同一会话中的所有线程使用 相同的临时表

thread_id

并向该表中添加一列。如果您大量使用此功能,请确保为该列编制索引。然后在
thread_id
每个线程中使用唯一的线程(在同一会话中)。

只有一次:

CREATE SEQUENCE myseq;

每个线程一次:

CREATE TEMP TABLE tmptbl(thread_id int, col1 int) IF NOT EXISTS;my_id :=  nextval('myseq'); -- in plpgsql-- else find another way to assign unique id per thread

SQL:

INSERT INTO tmptbl(thread_id, col1) VALUES(my_id, 2), (my_id, 3), (my_id, 4);SELECT * FROM tmptbl WHERe thread_id = my_id;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431080.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号