1

我正在构建一个更改捕获系统,该系统通过逻辑解码输出插件使用 Postgres WAL。

在回调中,很容易访问当前的 transactionId ( https://doxygen.postgresql.org/structReorderBufferTXN.html#ad3ff4a8f320f2ec21e3e07688d29c741 ) 但这是 32 位的,可以在 4B 提交后环绕,因此它不可靠,因为一个逻辑计数器。

Postgres 内部维护一个不环绕的 64 位 transactionID(选择 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

是否可以从逻辑解码插件访问此 ID?如果不是,那是什么原因呢?

谢谢

4

1 回答 1

1

你有两个选择:

  1. OidFunctionCall0用来调用 SQL 函数txid_current()

  2. 您从txid_current和复制load_xid_epoch代码。convert_xidsrc/backend/utils/adt/txid.c

第二个选项会更快,但你必须复制代码。

于 2019-06-21T11:03:51.550 回答