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

Postgresql 在postgres中,(错误地)使用临时(会话本地)序列作为事务本地序列是否安全?,postgresql,database-design,transactions,Postgresql,Database Design,Transactions,我想要一个计数器,每当新事务开始时,我都会将其重置为0。我想在一些触发器中使用该计数器的值。由于postgres临时序列是本地会话,因此只有在同一会话中不可能有两个事务“并行”运行时,我才可以使用其中一个作为计数器。这在研究生中是安全的吗?(我想到的让我感到不确定的情况是Oracle中的自治事务。在这种情况下,我的会话本地对象将由外部事务和内部自治事务共享,这将破坏我想要的对象的事务本地性。) 我知道我可以在提交时使用临时表删除行,但我想知道临时序列是否足够,至少在postgres中是这样。目前

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


我知道我可以在提交时使用临时表删除行,但我想知道临时序列是否足够,至少在postgres中是这样。

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

目前,在Pg中模拟自治事务的唯一方法是使用dblink建立到数据库的新连接。因为这也建立了一个新的独立会话,所以dblink不需要担心任何问题

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

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

如果你想的话,你现在就可以这样做;使用
txid\u 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)

虽然我猜这取决于实现细节。

那么您的问题到底是什么?“安全吗?”不够具体。你想实现什么?我想知道一个会话本地对象是否可以被多个事务以任何可能的方式同时访问。我更详细地描述了我问题的背景。抱歉,如果不清楚的话。我想了一下,但我没有这样做,因为我觉得txid会随着保存点的变化而变化。这不是真的吗?@Paralife:另外,使用动态标识符操作会使使用列默认值或非动态SQL等功能变得很困难。txid不会在保存点之间更改-请参见上文。如果您担心这一点,那么可以从txid和当前的_时间戳构建一个标识符(这在txn开始时是固定的)。[编辑:那是胡说八道;TXD仍然会改变。你不能只使用时间戳,以防两个TXN同时启动,降低到计时器分辨率。呃。只要依靠TXD不改变,并且测试升级就好了!]我认为这不会特别漂亮,但您可以将其封装在一个简单的SQL函数中,以使其更易于在默认值和非动态SQL中使用,正如Erwin提到的那样。