txid_current()如何工作?

时间:2015-09-17 03:22:28

标签: postgresql transactions

我有以下psql语句:

假设:初始txid:a

select txid_current();
----------------------
a+1

begin;
insert into tab( v1,v2);
insert into tab (v3,v4);
commit;

select txid_current();
----------------------
a+3

为什么我认为交易ID为+ 3不应该是+ 2? txid_current如何工作? 有没有有效的方法我只能返回当前的txid而不需要额外的增量?

1 个答案:

答案 0 :(得分:12)

要理解的要点:

  • 一切都在交易中。如果您没有使用BEGINCOMMIT(或ROLLBACK)明确创建一个,则仅为该语句创建一个。

  • 只读SELECT没有获得完整的交易ID,他们只获得虚拟交易ID。因此即使它是一个事务,SELECT 1;或任何不增加事务ID计数器的事情。

  • 如果尚未分配事务ID,则调用txid_current() 强制分配事务ID。因此,只读事务现在将具有事务ID,而以前不会。

当然,还会在会话中分配txids。实际上,如果数据库繁忙,上面的示例可能会得到+ 1和+ 429的txid。

请勿在应用程序级别使用事务ID。它是一个内部系统级域。无论你想做什么,交易ID都可能不是正确的做法。