使用基本输出插件回调(例如,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
查找实现。
想要解码已准备好的事务的用户需要留意以下几点
如果已准备好的事务已独占锁定 [user] 目录表,则解码准备可能会阻塞,直到提交主事务。
如果已准备好的事务已独占锁定 [user] 目录表,则使用此功能构建分布式两阶段提交的逻辑复制解决方案可能会导致死锁。为避免这种情况,用户不得在这样的事务中锁定目录表(例如显式的 LOCK
命令)。请参阅 第 47.8.2 节 以了解详细信息。