diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index d2c6e155662..1765ea6c87e 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -1066,28 +1066,83 @@ OutputPluginWrite(ctx, true); Synchronous Replication Support for Logical Decoding + + Overview - - Logical decoding can be used to build - synchronous - replication solutions with the same user interface as synchronous - replication for streaming - replication. To do this, the streaming replication interface - (see ) must be used to stream out - data. Clients have to send Standby status update (F) - (see ) messages, just like streaming - replication clients do. - - - - A synchronous replica receiving changes via logical decoding will work in - the scope of a single database. Since, in contrast to - that, synchronous_standby_names currently is - server wide, this means this technique will not work properly if more - than one database is actively used. + Logical decoding can be used to build + synchronous + replication solutions with the same user interface as synchronous + replication for streaming + replication. To do this, the streaming replication interface + (see ) must be used to stream out + data. Clients have to send Standby status update (F) + (see ) messages, just like streaming + replication clients do. + + + + + A synchronous replica receiving changes via logical decoding will work in + the scope of a single database. Since, in contrast to + that, synchronous_standby_names currently is + server wide, this means this technique will not work properly if more + than one database is actively used. - + + + + + Caveats + + + In synchronous replication setup, a deadlock can happen, if the transaction + has locked [user] catalog tables exclusively. This is because logical decoding of + transactions can lock catalog tables to access them. To avoid this users + must refrain from taking an exclusive lock on [user] catalog tables. This can + happen in the following ways: + + + + + Issuing an explicit LOCK on pg_class + (or any other catalog table) in a transaction. + + + + + + Perform CLUSTER on pg_class in + a transaction. + + + + + + PREPARE TRANSACTION after LOCK command + on pg_class and allow logical decoding of two-phase + transactions. + + + + + + PREPARE TRANSACTION after CLUSTER + command on pg_trigger and allow logical decoding of + two-phase transactions. This will lead to deadlock only when published table + have a trigger. + + + + + + Executing TRUNCATE on [user] catalog table in a + transaction. + + + + + @@ -1253,9 +1308,10 @@ stream_commit_cb(...); <-- commit of the streamed transaction The logical replication solution that builds distributed two phase commit using this feature can deadlock if the prepared transaction has locked - [user] catalog tables exclusively. They need to inform users to not have - locks on catalog tables (via explicit LOCK command) in - such transactions. + [user] catalog tables exclusively. To avoid this users must refrain from + having locks on catalog tables (e.g. explicit LOCK command) + in such transactions. + (See for the details.)