↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
测试版PostgreSQL 19 Rc 1 尚未正式发布,内容与行为在正式发布前可能变化。正式内容请看当前版本。

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

使用基本输出插件回调(例如 begin_cb、change_cb、commit_cb 和 message_cb)时,PREPARE TRANSACTION、COMMIT PREPARED 和 ROLLBACK PREPARED 这类两阶段提交命令不会被解码。PREPARE TRANSACTION 会被忽略,而 COMMIT PREPARED 会被解码为 COMMIT,ROLLBACK PREPARED 则会被解码为 ROLLBACK。

为了支持两阶段命令的流式传输,输出插件需要提供额外的回调。所需的两阶段提交回调有多个:begin_prepare_cb、prepare_cb、commit_prepared_cb、rollback_prepared_cb 和 stream_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 查找来实现。

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

  • 如果预备事务对目录表(包括用户目录表)持有排他锁,那么解码 PREPARE 可能会阻塞,直到主事务提交为止。

  • 使用这一特性构建分布式两阶段提交的逻辑复制方案时,如果预备事务对目录表(包括用户目录表)持有排他锁,就可能发生死锁。为了避免这种情况,用户必须避免在这类事务中对目录表加锁(例如显式执行 LOCK 命令)。详见第 47.9.2 节。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游会在正式发布前持续修订。