我有以下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而不需要额外的增量?
答案 0 :(得分:12)
要理解的要点:
一切都在交易中。如果您没有使用BEGIN
和COMMIT
(或ROLLBACK
)明确创建一个,则仅为该语句创建一个。
只读SELECT
没有获得完整的交易ID,他们只获得虚拟交易ID。因此即使它是一个事务,SELECT 1;
或任何不增加事务ID计数器的事情。
如果尚未分配事务ID,则调用txid_current()
强制分配事务ID。因此,只读事务现在将具有事务ID,而以前不会。
当然,还会在会话中分配txids。实际上,如果数据库繁忙,上面的示例可能会得到+ 1和+ 429的txid。
请勿在应用程序级别使用事务ID。它是一个内部系统级域。无论你想做什么,交易ID都可能不是正确的做法。