47.8. Soporte de replicación síncrona para la decodificación lógica #

47.8.1. Resumen
47.8.2. Advertencias

47.8.1. Resumen #

La decodificación lógica se puede utilizar para construir soluciones de replicación síncrona con la misma interfaz de usuario que la replicación síncrona para la replicación en flujo (streaming replication). Para hacer esto, se debe utilizar la interfaz de replicación en flujo (consulta la Section 47.3) para transmitir los datos. Los clientes deben enviar mensajes de Standby status update (F) (consulta la Section 54.4), tal como lo hacen los clientes de replicación en flujo.

Note

Una réplica síncrona que reciba cambios a través de la decodificación lógica funcionará en el ámbito de una sola base de datos. Dado que, por el contrario, synchronous_standby_names es actualmente para todo el servidor, esto significa que esta técnica no funcionará correctamente si se utiliza activamente más de una base de datos.

47.8.2. Advertencias #

En una configuración de replicación síncrona, puede ocurrir un interbloqueo (deadlock) si la transacción ha bloqueado las tablas del catálogo [del usuario] exclusivamente. Consulta la Section 47.6.2 para obtener información sobre las tablas del catálogo del usuario. Esto se debe a que la decodificación lógica de las transacciones puede bloquear las tablas del catálogo para acceder a ellas. Para evitar esto, los usuarios deben abstenerse de tomar un bloqueo exclusivo en las tablas del catálogo [del usuario]. Esto puede ocurrir de las siguientes maneras:

  • Emitiendo un LOCK explícito en pg_class en una transacción.

  • Realizando CLUSTER en pg_class en una transacción.

  • Ejecutando PREPARE TRANSACTION después del comando LOCK en pg_class y permitiendo la decodificación lógica de transacciones en dos fases.

  • Ejecutando PREPARE TRANSACTION después del comando CLUSTER en pg_trigger y permitiendo la decodificación lógica de transacciones en dos fases. Esto conducirá a un interbloqueo solo cuando la tabla publicada tenga un disparador (trigger).

  • Ejecutando TRUNCATE en la tabla del catálogo [del usuario] en una transacción.

Ten en cuenta que estos comandos pueden causar interbloqueos no solo para las tablas del catálogo del sistema enumeradas anteriormente, sino también para otras tablas del catálogo.