2013-12-15 1 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_ это? Транзакция должна быть неубывающей последовательностью чисел. Что это такое, даже когда оно увеличивается транзакциями в других базах данных. – wildplasser

+0

Хотя вы можете только * подключить * к одной базе данных за раз, я думаю, что большое количество данных Postgres фактически управляется на уровне «кластера». Например, встроенная репликация может выполняться только на уровне кластера. – IMSoP

ответ

6

Счетчик идентификаторов транзакций является глобальным по всему серверу. Это необходимо отчасти потому, что PostgreSQL имеет некоторые глобальные таблицы, такие как pg_database, pg_role и т. Д., Которые видны во всех базах данных. Чтобы сделать эти транзакции, нам нужен глобальный идентификатор транзакции.

Нельзя использовать идентификатор транзакции для всего, кроме идентификатора транзакции. Вы даже не можете предположить, что более низкий идентификатор транзакции является более старой транзакцией из-за переноса идентификатора транзакции.

Вы можете использовать txid_current_snapshot и txid_visible_in_snapshot (если вы находитесь на новом достаточно PostgreSQL), чтобы рассуждать о видимости. Удивительно, но я не вижу системной функции для сравнения двух идентификаторов транзакций в отношении текущего глобального xmin для переноса транзакций.

+0

Большое спасибо, ответы всегда превосходны. Моя цель в вопросе была просто понять. Я не намерен использовать xid для чего-либо кроме учебника, чтобы представить разработчикам в моей команде, как postgres управляет транзакциями. – ams

Смежные вопросы