↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
开发快照。 PostgreSQL 20devel 尚未正式发布,内容仍可能变化。

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 节。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.