46.10. Поддержка двухфазного коммита для логического декодирования#

46.10. Поддержка двухфазного коммита для логического декодирования

46.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.

Пользователи, которые хотят декодировать подготовленные транзакции, должны быть осторожны в отношении нижеуказанных моментов:

  • Если подготовленная транзакция заблокировала каталоговые таблицы [user] исключительно, то декодирование подготовки может заблокироваться до тех пор, пока основная транзакция не будет подтверждена.

  • Решение логической репликации, которое строит распределенный двухфазный коммит, используя эту функцию, может привести к блокировке, если подготовленная транзакция заблокировала каталоговые таблицы [user] исключительно. Чтобы избежать этого, пользователи должны воздерживаться от блокировки каталоговых таблиц (например, явной командой LOCK) в таких транзакциях. См. Раздел 46.8.2 для получения подробной информации.