为什么新创建的数据库的postgres tx id不能从1开始?

时间:2013-12-15 22:30:07

标签: postgresql

我想了解postgres如何处理交易的细节;我注意到当在psql上执行以下命令时,我得到一个位于518526的txid,而不是像0或1那样的低数,这是我预期会发生的。

postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \connect test;
You are now connected to database "test" as user "postgres".
test=# begin;
BEGIN
test=# select txid_current();
 txid_current 
--------------
       518526
(1 row)

在第二个psql控制台上输入

postgres=# CREATE DATABASE test3;
CREATE DATABASE
postgres=# \connect test3
You are now connected to database "test3" as user "postgres".
test3=# begin;
BEGIN
test3=# select txid_current();
 txid_current 
--------------
       518528
(1 row)

所以看起来对于postgres服务器中的所有数据库,下一个txid似乎在所有数据库中共享。为什么postgres跨数据库使用txid而不是基于每个数据库?

1 个答案:

答案 0 :(得分:6)

交易ID计数器在整个服务器上是全局的。这是必要的,部分原因是PostgreSQL有一些全局表,如pg_databasepg_role等,这些表在所有数据库中都是可见的。要进行这些事务处理,我们需要一个全局事务ID。

除了交易标识符之外,您不应该使用交易ID。由于事务ID环绕,您甚至无法假设较低的事务ID是较旧的事务。

您可以使用txid_current_snapshottxid_visible_in_snapshot(如果您使用足够新的PostgreSQL)来推断可见性。令人惊讶的是,我没有看到系统函数来比较两个事务ID与当前全局xmin进行事务环绕。