使用基本的输出插件回调(例如,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
进行查找来实现。
想要解码预备事务的用户需要注意下面提到的几点
如果预备事务独占锁定了[用户]目录表,那么解码预备操作可能会阻塞,直到主事务提交为止。
如果预备事务独占锁定了[用户]目录表,那么使用此功能构建分布式两阶段提交的逻辑复制解决方案可能会发生死锁。为了避免这种情况,用户必须避免在此类事务中锁定目录表(例如,显式的 LOCK
命令)。有关详细信息,请参阅 第 47.8.2 节。
如果您在文档中发现任何不正确、与您特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。