受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

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

使用基本输出插件回调(例如 begin_cbchange_cbcommit_cbmessage_cb)时, PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED 这类两阶段提交命令不会被解码。 PREPARE TRANSACTION 会被忽略,而 COMMIT PREPARED 会被解码为 COMMITROLLBACK 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 查找来实现。

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

  • 如果预备事务对 [user] 目录表持有排他锁,那么解码 PREPARE 可能会阻塞, 直到主事务提交为止。

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

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。