2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14
开发版本:devel

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 进行查找来实现。

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

  • 如果已准备的事务已独占锁定 [用户] 目录表,则解码准备操作可能会阻塞,直到主事务提交。

  • 使用此功能构建分布式二阶段提交的逻辑复制解决方案可能会发生死锁,如果已准备的事务已独占锁定 [用户] 目录表。为了避免这种情况,用户必须避免在这些事务中对目录表进行锁定(例如,显式的 LOCK 命令)。有关详细信息,请参阅 第 47.8.2 节

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表单 报告文档问题。