On Mon, 2023-01-30 at 17:10 +0800, qihua wu wrote: > I have a patroni cluster running in sync mode and at least 2 nodes should be > synced for commit. Now I brought down one node, so only one slave is in sync, > and then write a java program to write the data to primary in autocommit = false > mode, I set statement_timeout to 10, hopping the jave will throw exception > after 10 seconds after I send a commit command to postgresq, but after 10 seconds, > it didn't throw any exception, so looks like statement_timeout doesn't apply to > commit. Is that theory right?. I assume you are talking about synchronous replication. static void CommitTransaction(void) { [...] /* Prevent cancel/die interrupt while cleaning up */ HOLD_INTERRUPTS(); [...] if (!is_parallel_worker) { /* * We need to mark our XIDs as committed in pg_xact. This is where we * durably commit. */ latestXid = RecordTransactionCommit(); } [...] RESUME_INTERRUPTS(); } static TransactionId RecordTransactionCommit(void) { [...] /* * Wait for synchronous replication, if required. Similar to the decision * above about using committing asynchronously we only want to wait if * this backend assigned an xid and wrote WAL. No need to wait if an xid * was assigned due to temporary/unlogged tables or due to HOT pruning. * * Note that at this stage we have marked clog, but still show as running * in the procarray and continue to hold locks. */ if (wrote_xlog && markXidCommitted) SyncRepWaitForLSN(XactLastRecEnd, true); [...] } So yes, it looks like you are right. Yours, Laurenz Albe