Логическое декодирование может применяться для создания решений
синхронной
репликации
с тем же пользовательским интерфейсом, что и у синхронной репликации для
потоковой
репликации
. Для этого должен использоваться интерфейс потоковой репликации (см.
Раздел 5.12.3
) для потоковой передачи данных. Клиенты должны отправлять
сообщения «Обновление статуса резервного сервера (F)»
(см.
Раздел 7.4.4
), аналогично клиентам потоковой репликации.
Синхронная реплика, получающая изменения посредством логического декодирования, будет работать в рамках одной базы данных. Поскольку, в отличие от
этого, параметр
synchronous_standby_names
в настоящее время действует на уровне всего сервера, данный метод не будет работать корректно при активном использовании нескольких баз данных.
В конфигурации с синхронной репликацией может возникнуть взаимоблокировка (deadlock), если транзакция эксклюзивно заблокировала пользовательские таблицы каталога. См. Раздел 5.12.6.2 для получения информации о пользовательских таблицах каталога. Это обусловлено тем, что логическое декодирование транзакций может блокировать таблицы каталога для доступа к ним. Чтобы избежать этого, пользователи должны воздерживаться от наложения исключительной блокировки на [пользовательские] таблицы каталога. Это может произойти следующими способами:
Выполнение явной команды
LOCK
для
pg_class
в рамках транзакции.
Выполнение команды
CLUSTER
для
pg_class
в
транзакции.
PREPARE TRANSACTION
после
LOCK
команды
для
pg_class
и разрешить логическое декодирование двухфазных
транзакций.
PREPARE TRANSACTION
после
CLUSTER
команды для
pg_trigger
и разрешить логическое декодирование
двухфазные транзакции. Это приведет к взаимоблокировке только в том случае, если опубликованная таблица
имеет триггер.
Выполнение
TRUNCATE
операции над таблицей каталога [user] в
транзакции.
Обратите внимание, что эти команды могут вызывать взаимоблокировки не только в системных таблицах каталога, перечисленных выше, но и в других таблицах каталога.