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.