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 для получения подробной информации.