При использовании базовых функций обратного вызова плагина вывода (например,
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
callback-функция. Это отличается от базовой схемы декодирования, при которой изменения передаются в плагин вывода только в момент фиксации транзакции. На начало подготовленной транзакции указывает
begin_prepare_cb
callback.
Когда подготовленная транзакция отменяется с помощью команды
ROLLBACK PREPARED
, вызывается функция обратного вызова
rollback_prepared_cb
, а когда подготовленная транзакция фиксируется с помощью команды
COMMIT PREPARED
,
вызывается функция обратного вызова
commit_prepared_cb
callback.
Плагин вывода может дополнительно определять правила фильтрации через
filter_prepare_cb
для декодирования только определенных транзакций
в две фазы. Это может быть реализовано с помощью сопоставления по шаблону в
gid
или путем поиска с использованием
xid
.
Пользователям, желающим декодировать подготовленные транзакции, необходимо учитывать следующие моменты:
Если подготовленная транзакция монопольно заблокировала таблицы каталога [user], то декодирование операции PREPARE может быть заблокировано до фиксации основной транзакции.
Решение для логической репликации, реализующее распределенную двухфазную фиксацию
с использованием данной функциональности, может привести к взаимной блокировке, если подготовленная транзакция заблокировала
таблицы каталога [user] монопольно. Чтобы избежать этого, пользователям следует воздержаться от
установки блокировок на таблицы каталога (например, явных
LOCK
команд)
в таких транзакциях.
См.
Раздел 5.12.8.2
подробную информацию.