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