From e8051df2c11b5836b0ce52881bb52cb535c91b92 Mon Sep 17 00:00:00 2001
From: Tom Lane
Date: Wed, 12 Mar 2008 20:12:14 +0000
Subject: Fix LISTEN/NOTIFY race condition reported by Laurent Birtz, by
postponing pg_listener modifications commanded by LISTEN and UNLISTEN until
the end of the current transaction. This allows us to hold the ExclusiveLock
on pg_listener until after commit, with no greater risk of deadlock than
there was before. Aside from fixing the race condition, this gets rid of a
truly ugly kludge that was there before, namely having to ignore
HeapTupleBeingUpdated failures during NOTIFY. There is a small potential
incompatibility, which is that if a transaction issues LISTEN or UNLISTEN and
then looks into pg_listener before committing, it won't see any resulting row
insertion or deletion, where before it would have. It seems unlikely that
anyone would be depending on that, though.
This patch also disallows LISTEN and UNLISTEN inside a prepared transaction.
That case had some pretty undesirable properties already, such as possibly
allowing pg_listener entries to be made for PIDs no longer present, so
disallowing it seems like a better idea than trying to maintain the behavior.
---
doc/src/sgml/ref/prepare_transaction.sgml | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
(limited to 'doc/src')
diff --git a/doc/src/sgml/ref/prepare_transaction.sgml b/doc/src/sgml/ref/prepare_transaction.sgml
index 6230f043825..c250751f4d8 100644
--- a/doc/src/sgml/ref/prepare_transaction.sgml
+++ b/doc/src/sgml/ref/prepare_transaction.sgml
@@ -1,5 +1,5 @@
@@ -88,8 +88,10 @@ PREPARE TRANSACTION transaction_id
It is not currently allowed to PREPARE> a transaction that
- has executed any operations involving temporary tables or
- created any cursors WITH HOLD>. Those features are too tightly
+ has executed any operations involving temporary tables,
+ created any cursors WITH HOLD>, or executed
+ LISTEN> or UNLISTEN>.
+ Those features are too tightly
tied to the current session to be useful in a transaction to be prepared.
--
cgit v1.2.3