49.10。 逻辑解码的两阶段提交支持#
对于基本输出插件回调(例如,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命令)。有关详细信息,请参阅 第 49.8.2 节。
