【问题标题】:Is it possible to get the current 64 bit transactionId (with the epoch) in a postgreSQL logical replication plugin是否可以在 postgreSQL 逻辑复制插件中获取当前的 64 位 transactionId(带有纪元)
【发布时间】:2019-06-20 19:19:57
【问题描述】:

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

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

Postgres 在内部维护一个不回绕的 64 位 transactionID (select 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?如果不是,那是什么原因?

谢谢

【问题讨论】:

    标签: postgresql wal logical-replication


    【解决方案1】:

    你有两个选择:

    1. 你使用OidFunctionCall0调用SQL函数txid_current()

    2. 您从txid_currentload_xid_epochconvert_xid 复制代码从src/backend/utils/adt/txid.c

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

    【讨论】:

    • 不,没有竞争条件。如果在数据修改事务中使用该函数,它不会生成新的 txid,但会返回当前的。
    • 感谢 Laurenz,关于这两个选项,他们将返回下一个 xid(我相信 txid_current() 将实际创建事务,而 load_xid_epoch 不会在 github.com/postgres/postgres/blob/...)。如果两个事务是并发的并且在第一个和第二个提交事件之间没有新事务开始,那么两个不同进程中几乎同时发生的两个提交实际上是否有可能生成相同的“下一个事务 id”?
    • 对不起,我删除了评论,以便在答案出现之前更好地重新表述这个想法。Lorenz 的原始回复是:“谢谢 Laurenz,关于这两个选项,他们会返回下一个 xid(其中我相信 txid_current() 实际上会创建事务,而 load_xid_epoch 不会在 github.com/postgres/postgres/blob/...)。这会与我在 WAL 上消费的事务的提交同步吗?或者我可以运行进入线程问题,例如几乎同时发生的两个提交返回相同的“下一个 xid”?”
    • txid_current() 从不同的事务调用时将返回不同的txid(否则 PostgreSQL 将无法工作)。我想知道为什么您需要在逻辑解码插件中使用它。
    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多