From a3dc599f9295e9461c3646dc764ee8bcf9bee47d Mon Sep 17 00:00:00 2001
From: "Karl O. Pinc" <kop@karlpinc.com>
Date: Tue, 3 Oct 2023 12:11:31 -0500
Subject: [PATCH v7 16/16] Predicate locks are held per-cluster, not
 per-database

I believe this is still true and nothing has changed since
this email thread:
https://www.postgresql.org/message-id/20170518110712.31caaf3b@slate.meme.com

This is a significant corner case and so should be documented.  It is
also somewhat suprising since the databases within a cluster are
otherwise isolated, at least from the user's perspective.

I mention psql pagination because it is easy to overlook the fact that
it is not just end-user applications that generate transactions.

I have not thought about this in a long time and am not 100% certain
that WAL checkpoints on segments are delayed until the predicate lock
for the respective transaction is released.  I'm pretty sure, but this
should be checked.

I am sure that all concurrent predicate locks must be released
together.  See the 2nd to last sentence of ports12:
https://arxiv.org/pdf/1208.4179.pdf

The index entries might be improved.  The idea is to guide someone
who's got a lot of WAL laying around and is using serializable
transactions.
---
 doc/src/sgml/mvcc.sgml | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml
index f8f83d463d..b021a2d2de 100644
--- a/doc/src/sgml/mvcc.sgml
+++ b/doc/src/sgml/mvcc.sgml
@@ -829,6 +829,34 @@ ERROR:  could not serialize access due to read/write dependencies among transact
        query execution time.
       </para>
      </listitem>
+     <listitem>
+
+       <indexterm>
+         <primary>WAL</primary>
+         <secondary>Serializeable Snapshot Isolation and
+           WAL checkpoint delay</secondary>
+       </indexterm>
+       
+       <indexterm>
+         <primary>Serializable Snapshot Isolation</primary>
+         <secondary>WAL checkpoint delay</secondary>
+       </indexterm>
+
+       <para>
+         Predicate locks are held per-cluster, not per database.
+         This means that serializeable transactions in one database can have
+         effects in another.
+         Long running serializeable transactions, as might occur accidentally
+         when
+         <link linkend="app-psql-meta-command-pset-pager">pagination</link>
+         halts <link linkend="app-psql">psql</link> output, can have
+         significant inter-database effects.
+         These include exhausting available predicate locks and
+         cluster-wide <link linkend="ports12">WAL checkpoint delay</link>.
+         When making use of serializeable transactions consider having
+         separate clusters for production and non-production use.
+       </para>
+     </listitem>
     </itemizedlist>
    </para>
 
-- 
2.30.2

