事务ID换行后,如何比较xmin和txid_current()?


12

除其常规列外,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将从零开始。这意味着两者都开始在那个时候返回不同的值?

如果是这样,是否有一种方法可以提取结果的常规xidtxid_current(),使其与xmin表中的条目匹配(例如,转换txid_current()为整数)?

编辑:更加清楚地表明,我关心在事务ID换行之后会发生什么,这很可能在2 ^ 32个事务之前发生。感谢DanielVérité在评论中指出这一点。


1
您忽略了这样一个事实,即系统将在2 ^ 32环绕之前很久VACUUM FREEZE并覆盖xminon行。请查看“ 关闭元组”,以获取有关该主题的概述。
DanielVérité16年

没错,感谢您指出这一事实,我将这一事实排除在外。实际上冻结将在2 ^ 32之前发生。然而,即使旧的xmin变得僵化了,问题仍然xmin在于与后来执行的相比,新的(常规)有多大txid_current()
tomka '16

1
值得一提的是,如果只有不到100万笔交易(直到折回),PostgreSQL将关闭。
user103153 '16

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.