Можно ли получить текущий 64-битный ID транзакции (с эпохой) в плагине логической репликации postgreSQL - PullRequest
1 голос
/ 20 июня 2019

Я строю систему Change Capture, которая использует Postgres WAL через плагин вывода логического декодирования.

В обратных вызовах очень легко получить доступ к текущему идентификатору транзакции (https://doxygen.postgresql.org/structReorderBufferTXN.html#ad3ff4a8f320f2ec21e3e07688d29c741)), но это 32-битный код, который можно обернуть после фиксации 4B, поэтому он не надежен в качестве логического счетчика.

Postgres внутренне поддерживает 64-битный ID транзакции, который не переносится (выберите txid_current ()): https://www.postgresql.org/docs/9.4/functions-info.html#FUNCTIONS-TXID-SNAPSHOT

https://github.com/postgres/postgres/blob/3412030205211079f9b0510e2244083e4ee7b15a/src/backend/access/transam/xact.c#L473-L488

Возможно ли получить доступ к этому идентификатору из плагина логического декодирования? А если нет, то с чем это связано?

Спасибо

1 Ответ

1 голос
/ 21 июня 2019

У вас есть два варианта:

  1. Вы используете OidFunctionCall0 для вызова функции SQL txid_current().

  2. Вы копируете код из txid_current, load_xid_epoch и convert_xid из src/backend/utils/adt/txid.c.

Второй вариант будет быстрее, но вам придется дублировать код.

...