我想了解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)
Run Code Online (Sandbox Code Playgroud)
在我输入的第二个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)
Run Code Online (Sandbox Code Playgroud)
所以看起来对于postgres服务器中的所有数据库,下一个txid似乎在所有数据库中共享.为什么postgres跨数据库使用txid而不是基于每个数据库?
事务ID计数器在服务器上是全局的.这是必要的部分原因是PostgreSQL有一些全球性的表像pg_database,pg_role等是所有数据库中可见.为了实现这些事务,我们需要一个全局事务ID.
除了事务的标识符之外,您不应该使用事务ID.由于事务ID环绕,您甚至不能假设较低的事务ID是较旧的事务.
您可以使用txid_current_snapshot和txid_visible_in_snapshot(如果您使用的是足够新的PostgreSQL)来推断可见性.令人惊讶的是,我没有看到系统函数来比较两个事务ID与当前全局xmin进行事务环绕.