我希望有一个计数器,每当有新的事务开始时,我都会将其重置为0。我希望在某些触发器中使用该计数器的值。由于postgres临时序列是会话本地的,因此只有在同一会话中不可能有两个事务“并行”运行时,我才能使用一个临时序列作为我的计数器。在Postgres中假设这是安全的吗?(在我的脑海中,让我感到不确定的是Oracle中的自主事务。在该场景中,我的会话本地对象将由外部事务和内部自治事务共享,这将破坏我想要的对象的事务局部性。)
我知道我可以使用带有ON COMMIT、DROP或DELETE行的临时表,但我想知道临时序列是否足够,至少在postgres中是这样。
发布于 2011-12-07 12:12:11
目前PostgreSQL不支持并行或自主事务,因此会话==事务和会话本地临时序列一次只能由一个事务访问。
目前,在Pg中模拟自治事务的唯一方法是使用dblink建立到数据库的新连接。因为这也建立了一个新的独立会话,所以dblink没有什么可担心的。
目前,它是安全的(如果我正确地解释了你想要的东西)。
从长远来看,我们希望引入自治事务作为真正的存储过程支持的一部分。这看起来还有很长的路要走,而且还不清楚自治事务是否能够看到它的父级创建的临时表和序列。您必须等待和观察,并准备好相应地调整您的方法,可能是通过使用以当前事务id (txid)命名的临时序列。
如果需要,现在可以这样做;使用txid_current()函数来获取当前事务ID。
编辑:不,txid不会在保存点之间改变。
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)尽管我猜这取决于实现细节。
https://stackoverflow.com/questions/8401964
复制相似问题