我想了解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而不是基于每个数据库?
答案 0 :(得分:6)
交易ID计数器在整个服务器上是全局的。这是必要的,部分原因是PostgreSQL有一些全局表,如pg_database
,pg_role
等,这些表在所有数据库中都是可见的。要进行这些事务处理,我们需要一个全局事务ID。
除了交易标识符之外,您不应该使用交易ID。由于事务ID环绕,您甚至无法假设较低的事务ID是较旧的事务。
您可以使用txid_current_snapshot
和txid_visible_in_snapshot
(如果您使用足够新的PostgreSQL)来推断可见性。令人惊讶的是,我没有看到系统函数来比较两个事务ID与当前全局xmin进行事务环绕。