Redrock Postgres 搜索 英文
版本: 14 / 15 / 16 / 17

47.10 逻辑解码的两阶段提交支持 #

使用基本输出插件回调(例如,begin_cbchange_cbcommit_cbmessage_cb)时,不会解码像 PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED 这样的两阶段提交命令。虽然会忽略 PREPARE TRANSACTION,但会将 COMMIT PREPARED 解码为 COMMIT,将 ROLLBACK PREPARED 解码为 ROLLBACK

要支持两阶段命令的流式传输,输出插件需要提供附加回调。需要多个两阶段提交回调,(begin_prepare_cbprepare_cbcommit_prepared_cbrollback_prepared_cbstream_prepare_cb),以及一个可选回调 (filter_prepare_cb)。

如果提供了用于解码两阶段提交命令的输出插件回调,那么在进行 PREPARE TRANSACTION 时,将解码该事务的更改,将其传递给输出插件,并调用 prepare_cb 回调。这与仅在事务提交时才将更改传递给输出插件的基本解码设置不同。准备的事务的开始由 begin_prepare_cb 回调表示。

当使用 ROLLBACK PREPARED 回滚已准备好的事务时,将调用 rollback_prepared_cb 回调;当使用 COMMIT PREPARED 提交已准备好的事务时,将调用 commit_prepared_cb 回调。

输出插件还可以通过 filter_prepare_cb 定义过滤规则,以便仅解码两阶段中的特定事务。这可以通过模式匹配 gid 实现,也可以通过使用 xid 查找实现。

想要解码已准备好的事务的用户需要留意以下几点