2013-12-15 52 views
1

我想了解postgres如何處理交易的細節;我注意到,當在psql上執行以下命令時,我得到一個txid,它位於518526處,而不是象0或1這樣的低數字,這正是我期望會發生的事情。爲什麼postgres tx id不是從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的控制檯I型

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

爲什麼_should_ it? transaction_id應該是一個非遞減的數字序列。即使在其他數據庫中的事務增加時也是如此。 – wildplasser

+0

儘管您一次只能*連接到一個數據庫,但我認爲大量的Postgres數據實際上是在「集羣」級別進行管理的。例如,本地複製只能在每個羣集級別上完成。 – IMSoP

回答

6

交易ID計數器在整個服務器上是全局的。這部分是因爲PostgreSQL有一些全局表,比如pg_databasepg_role等,它們在所有數據庫中都是可見的。爲了完成這些事務,我們需要一個全局事務ID。

除了交易的標識符之外,您不應該使用交易ID。由於事務ID環繞,您甚至不能假定較低的事務ID是舊事務。

您可以使用txid_current_snapshottxid_visible_in_snapshot(如果您使用的是足夠新的PostgreSQL)來推測可見性。令人驚訝的是,我沒有看到一個系統函數來比較兩個事務ID相對於當前全局xmin的事務環繞。

+0

非常感謝,你的回答總是優秀的。我對這個問題的目標只是爲了理解。我不打算將xid用於除教程以外的其他任何內容,以向我的團隊介紹devg如何管理事務。 – ams

相關問題