除其常规列外,Postgres表还具有各种可用的系统列。其中一个xmin
存储用于创建行的事务ID。它的数据类型是xid
,一个四字节整数,在某个点回绕(即不一定唯一)。该函数txid_current()
依次返回当前事务ID,但返回as bigint
,因为它“用“ epoch”计数器扩展,因此在安装期间不会回绕”(引用手册)。
如果尚未发生事务折回,则两个值似乎匹配:
# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
txid_current
--------------
674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
xmin
--------
674500
(1 row)
但是我想知道:这两个值是否总是可比的?据我了解,txid_current()
在交易ID换行后(最多2 ^ 32个交易),将继续提供唯一的值,并且xmin
将从零开始。这意味着两者都开始在那个时候返回不同的值?
如果是这样,是否有一种方法可以提取结果的常规xid
值txid_current()
,使其与xmin
表中的条目匹配(例如,转换txid_current()
为整数)?
编辑:更加清楚地表明,我关心在事务ID换行之后会发生什么,这很可能在2 ^ 32个事务之前发生。感谢DanielVérité在评论中指出这一点。
没错,感谢您指出这一事实,我将这一事实排除在外。实际上冻结将在2 ^ 32之前发生。然而,即使旧的
—
tomka '16
xmin
变得僵化了,问题仍然xmin
在于与后来执行的相比,新的(常规)有多大txid_current()
。
值得一提的是,如果只有不到100万笔交易(直到折回),PostgreSQL将关闭。
—
user103153 '16
VACUUM FREEZE
并覆盖xmin
on行。请查看“ 关闭元组”,以获取有关该主题的概述。