47.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
.
Реализуя декодирование подготовленных транзакций, следует учитывать следующие моменты:
Если подготовленная транзакция блокирует таблицы каталога (в том числе пользовательские) в исключительном режиме, декодирование PREPARE может заблокироваться, ожидая завершения основной транзакции.
Решение, осуществляющее логическую репликацию, которое организует распределённую двухфазную фиксацию с использованием этой функциональности, может заблокироваться, если подготовленная транзакция в исключительном режиме заблокирует таблицы каталога (в том числе пользовательские). Чтобы избежать этого, пользователи должны воздержаться от блокировок таблиц каталога (например, явной командой
LOCK
) в таких транзакциях. За подробностями обратитесь к Подразделу 47.8.2.