首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在postgres中,(错误地)使用临时(会话本地)序列作为事务本地序列是否安全?

在postgres中,(错误地)使用临时(会话本地)序列作为事务本地序列是否安全?
EN

Stack Overflow用户
提问于 2011-12-06 23:01:10
回答 1查看 416关注 0票数 0

我希望有一个计数器,每当有新的事务开始时,我都会将其重置为0。我希望在某些触发器中使用该计数器的值。由于postgres临时序列是会话本地的,因此只有在同一会话中不可能有两个事务“并行”运行时,我才能使用一个临时序列作为我的计数器。在Postgres中假设这是安全的吗?(在我的脑海中,让我感到不确定的是Oracle中的自主事务。在该场景中,我的会话本地对象将由外部事务和内部自治事务共享,这将破坏我想要的对象的事务局部性。)

我知道我可以使用带有ON COMMIT、DROP或DELETE行的临时表,但我想知道临时序列是否足够,至少在postgres中是这样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-07 12:12:11

目前PostgreSQL不支持并行或自主事务,因此会话==事务和会话本地临时序列一次只能由一个事务访问。

目前,在Pg中模拟自治事务的唯一方法是使用dblink建立到数据库的新连接。因为这也建立了一个新的独立会话,所以dblink没有什么可担心的。

目前,它是安全的(如果我正确地解释了你想要的东西)。

从长远来看,我们希望引入自治事务作为真正的存储过程支持的一部分。这看起来还有很长的路要走,而且还不清楚自治事务是否能够看到它的父级创建的临时表和序列。您必须等待和观察,并准备好相应地调整您的方法,可能是通过使用以当前事务id (txid)命名的临时序列。

如果需要,现在可以这样做;使用txid_current()函数来获取当前事务ID。

编辑:不,txid不会在保存点之间改变。

代码语言:javascript
复制
regress=> begin;
BEGIN
regress=> SELECT txid_current();
 txid_current 
--------------
       346947
(1 row)

regress=> savepoint test;
SAVEPOINT
regress=> SELECT txid_current();
 txid_current 
--------------
       346947
(1 row)

尽管我猜这取决于实现细节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8401964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档