aboutsummaryrefslogtreecommitdiff
path: root/doc/src/sgml/ref/notify.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/ref/notify.sgml')
-rw-r--r--doc/src/sgml/ref/notify.sgml417
1 files changed, 212 insertions, 205 deletions
diff --git a/doc/src/sgml/ref/notify.sgml b/doc/src/sgml/ref/notify.sgml
index 73eb7754268..f603258ebef 100644
--- a/doc/src/sgml/ref/notify.sgml
+++ b/doc/src/sgml/ref/notify.sgml
@@ -12,7 +12,7 @@ NOTIFY
<REFPURPOSE>
Signals all frontends and backends listening on a notify condition
</REFPURPOSE>
-
+ </refnamediv>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1998-10-07</DATE>
@@ -23,208 +23,215 @@ Signals all frontends and backends listening on a notify condition
NOTIFY <REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
</SYNOPSIS>
-<REFSECT2 ID="R2-SQL-NOTIFY-1">
-<REFSECT2INFO>
-<DATE>1998-10-07</DATE>
-</REFSECT2INFO>
-<TITLE>
-Inputs
-</TITLE>
-<PARA>
-
-<VARIABLELIST>
-<VARLISTENTRY>
-<TERM>
-<REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
-</TERM>
-<LISTITEM>
-<PARA>
-Notify condition to be signaled.
-
-</VARIABLELIST>
-
-</REFSECT2>
-
-<REFSECT2 ID="R2-SQL-NOTIFY-2">
-<REFSECT2INFO>
-<DATE>1998-10-07</DATE>
-</REFSECT2INFO>
-<TITLE>
-Outputs
-</TITLE>
-<PARA>
-
-<VARIABLELIST>
-<VARLISTENTRY>
-<TERM>
-NOTIFY
-</TERM>
-<LISTITEM>
-<PARA>
-Acknowledgement that notify command has executed.
-
-<VARLISTENTRY>
-<TERM>
-Notify events
-</TERM>
-<LISTITEM>
-<PARA>
-Events are delivered to listening frontends; whether and how each frontend
-application reacts depends on its programming.
-</PARA>
-</LISTITEM>
-</VARLISTENTRY>
-</VARIABLELIST>
-</REFSECT2>
-</REFSYNOPSISDIV>
-
-<REFSECT1 ID="R1-SQL-NOTIFY-1">
-<REFSECT1INFO>
-<DATE>1998-10-07</DATE>
-</REFSECT1INFO>
-<TITLE>
-Description
-</TITLE>
-<PARA>
-The <command>NOTIFY</command> command sends a notify event to each
-frontend application that has previously executed
-<command>LISTEN <replaceable class="parameter">notifyname</replaceable></command>
-for the specified notify condition in the current database.
-
-<para>
-The information passed to the frontend for a notify event includes the notify
-condition name and the notifying backend process's PID. It is up to the
-database designer to define the condition names that will be used in a given
-database and what each one means.
-
-<para>
-Commonly, the notify condition name is the same as the name of some table in
-the database, and the notify event essentially means "I changed this table,
-take a look at it to see what's new". But no such association is enforced by
-the <command>NOTIFY</command> and <command>LISTEN</command> commands. For
-example, a database designer could use several different condition names
-to signal different sorts of changes to a single table.
-
-<para>
-<command>NOTIFY</command> provides a simple form of signal or
-IPC (interprocess communication) mechanism for a collection of processes
-accessing the same <productname>Postgres</productname> database.
-Higher-level mechanisms can be built by using tables in the database to
-pass additional data (beyond a mere condition name) from notifier to
-listener(s).
-
-<para>
-When <command>NOTIFY</command> is used to signal the occurrence of changes
-to a particular table, a useful programming technique is to put the
-<command>NOTIFY</command> in a rule that is triggered by table updates.
-In this way, notification happens automatically when the table is changed,
-and the application programmer can't accidentally forget to do it.
-
-<para>
-<command>NOTIFY</command> interacts with SQL transactions in some important
-ways. Firstly, if a <command>NOTIFY</command> is executed inside a
-transaction, the notify events are not delivered until and unless the
-transaction is committed. This is appropriate, since if the transaction
-is aborted we would like all the commands within it to have had no effect
---- including <command>NOTIFY</command>. But it can be disconcerting if one
-is expecting the notify events to be delivered immediately. Secondly, if
-a listening backend receives a notify signal while it is within a transaction,
-the notify event will not be delivered to its connected frontend until just
-after the transaction is completed (either committed or aborted). Again, the
-reasoning is that if a notify were delivered within a transaction that was
-later aborted, one would want the notification to be undone somehow --- but
-the backend cannot "take back" a notify once it has sent it to the frontend.
-So notify events are only delivered between transactions. The upshot of this
-is that applications using <command>NOTIFY</command> for real-time signaling
-should try to keep their transactions short.
-
-<para>
-<command>NOTIFY</command> behaves like Unix signals in one important
-respect: if the same condition name is signaled multiple times in quick
-succession, recipients may get only one notify event for several executions
-of <command>NOTIFY</command>. So it is a bad idea to depend on the number
-of notifies received. Instead, use <command>NOTIFY</command> to wake up
-applications that need to pay attention to something, and use a database
-object (such as a sequence) to keep track of what happened or how many times
-it happened.
-
-<para>
-It is common for a frontend that sends <command>NOTIFY</command> to be
-listening on the same notify name itself. In that case it will get back a
-notify event, just like all the other listening frontends. Depending on the
-application logic, this could result in useless work --- for example,
-re-reading a database table to find the same updates that that frontend just
-wrote out. In <productname>Postgres</productname> 6.4 and later, it is
-possible to avoid such extra work by noticing whether the notifying backend
-process's PID (supplied in the notify event message) is the same as one's own
-backend's PID (available from libpq). When they are the same, the notify
-event is one's own work bouncing back, and can be ignored. (Despite what was
-said in the preceding paragraph, this is a safe technique.
-<productname>Postgres</productname> keeps self-notifies separate from notifies
-arriving from other backends, so you cannot miss an outside notify by ignoring
-your own notifies.)
-
-<REFSECT2 ID="R2-SQL-NOTIFY-3">
-<REFSECT2INFO>
-<DATE>1998-10-07</DATE>
-</REFSECT2INFO>
-<TITLE>
-Notes
-</TITLE>
-<para>
-<REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
-can be any string valid as a name;
-it need not correspond to the name of any actual table. If
-<REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
-is enclosed in double-quotes, it need not even be a syntactically
-valid name, but can be any string up to 31 characters long.
-
-<para>
-In some previous releases of
-<productname>Postgres</productname>,
-<REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
-had to be enclosed in double-quotes when it did not correspond to any existing
-table name, even if syntactically valid as a name. That is no longer required.
-
-<para>
-In <productname>Postgres</productname> releases prior to 6.4, the backend
-PID delivered in a notify message was always the PID of the frontend's own
-backend. So it was not possible to distinguish one's own notifies from other
-clients' notifies in those earlier releases.
-
-</REFSECT2>
-
-<REFSECT1 ID="R1-SQL-NOTIFY-2">
-<TITLE>
-Usage
-</TITLE>
-<PARA>
-<ProgramListing>
--- Configure and execute a listen/notify sequence from psql
-postgres=> listen virtual;
-LISTEN
-postgres=> notify virtual;
-NOTIFY
-ASYNC NOTIFY of 'virtual' from backend pid '11239' received
-</ProgramListing>
-
-</REFSECT1>
-
-<REFSECT1 ID="R1-SQL-NOTIFY-3">
-<TITLE>
-Compatibility
-</TITLE>
-<PARA>
-
-
-<REFSECT2 ID="R2-SQL-NOTIFY-4">
-<REFSECT2INFO>
-<DATE>1998-09-24</DATE>
-</REFSECT2INFO>
-<TITLE>
-SQL92
-</TITLE>
-<PARA>
-There is no <command>NOTIFY</command> statement in <acronym>SQL92</acronym>.
-
+ <REFSECT2 ID="R2-SQL-NOTIFY-1">
+ <REFSECT2INFO>
+ <DATE>1998-10-07</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Inputs
+ </TITLE>
+ <PARA>
+
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ <REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ Notify condition to be signaled.
+ </para>
+ </listitem>
+ </varlistentry>
+ </VARIABLELIST>
+ </para>
+ </REFSECT2>
+
+ <REFSECT2 ID="R2-SQL-NOTIFY-2">
+ <REFSECT2INFO>
+ <DATE>1998-10-07</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Outputs
+ </TITLE>
+ <PARA>
+
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ NOTIFY
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ Acknowledgement that notify command has executed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <VARLISTENTRY>
+ <TERM>
+ Notify events
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ Events are delivered to listening frontends; whether and how each frontend
+ application reacts depends on its programming.
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+ </VARIABLELIST>
+ </para>
+ </REFSECT2>
+ </REFSYNOPSISDIV>
+
+ <REFSECT1 ID="R1-SQL-NOTIFY-1">
+ <REFSECT1INFO>
+ <DATE>1998-10-07</DATE>
+ </REFSECT1INFO>
+ <TITLE>
+ Description
+ </TITLE>
+ <PARA>
+ The <command>NOTIFY</command> command sends a notify event to each
+ frontend application that has previously executed
+ <command>LISTEN <replaceable class="parameter">notifyname</replaceable></command>
+ for the specified notify condition in the current database.
+ </para>
+ <para>
+ The information passed to the frontend for a notify event includes the notify
+ condition name and the notifying backend process's PID. It is up to the
+ database designer to define the condition names that will be used in a given
+ database and what each one means.
+ </para>
+ <para>
+ Commonly, the notify condition name is the same as the name of some table in
+ the database, and the notify event essentially means "I changed this table,
+ take a look at it to see what's new". But no such association is enforced by
+ the <command>NOTIFY</command> and <command>LISTEN</command> commands. For
+ example, a database designer could use several different condition names
+ to signal different sorts of changes to a single table.
+ </para>
+ <para>
+ <command>NOTIFY</command> provides a simple form of signal or
+ IPC (interprocess communication) mechanism for a collection of processes
+ accessing the same <productname>Postgres</productname> database.
+ Higher-level mechanisms can be built by using tables in the database to
+ pass additional data (beyond a mere condition name) from notifier to
+ listener(s).
+ </para>
+ <para>
+ When <command>NOTIFY</command> is used to signal the occurrence of changes
+ to a particular table, a useful programming technique is to put the
+ <command>NOTIFY</command> in a rule that is triggered by table updates.
+ In this way, notification happens automatically when the table is changed,
+ and the application programmer can't accidentally forget to do it.
+ </para>
+ <para>
+ <command>NOTIFY</command> interacts with SQL transactions in some important
+ ways. Firstly, if a <command>NOTIFY</command> is executed inside a
+ transaction, the notify events are not delivered until and unless the
+ transaction is committed. This is appropriate, since if the transaction
+ is aborted we would like all the commands within it to have had no effect
+ --- including <command>NOTIFY</command>. But it can be disconcerting if one
+ is expecting the notify events to be delivered immediately. Secondly, if
+ a listening backend receives a notify signal while it is within a transaction,
+ the notify event will not be delivered to its connected frontend until just
+ after the transaction is completed (either committed or aborted). Again, the
+ reasoning is that if a notify were delivered within a transaction that was
+ later aborted, one would want the notification to be undone somehow --- but
+ the backend cannot "take back" a notify once it has sent it to the frontend.
+ So notify events are only delivered between transactions. The upshot of this
+ is that applications using <command>NOTIFY</command> for real-time signaling
+ should try to keep their transactions short.
+ </para>
+ <para>
+ <command>NOTIFY</command> behaves like Unix signals in one important
+ respect: if the same condition name is signaled multiple times in quick
+ succession, recipients may get only one notify event for several executions
+ of <command>NOTIFY</command>. So it is a bad idea to depend on the number
+ of notifies received. Instead, use <command>NOTIFY</command> to wake up
+ applications that need to pay attention to something, and use a database
+ object (such as a sequence) to keep track of what happened or how many times
+ it happened.
+ </para>
+ <para>
+ It is common for a frontend that sends <command>NOTIFY</command> to be
+ listening on the same notify name itself. In that case it will get back a
+ notify event, just like all the other listening frontends. Depending on the
+ application logic, this could result in useless work --- for example,
+ re-reading a database table to find the same updates that that frontend just
+ wrote out. In <productname>Postgres</productname> 6.4 and later, it is
+ possible to avoid such extra work by noticing whether the notifying backend
+ process's PID (supplied in the notify event message) is the same as one's own
+ backend's PID (available from libpq). When they are the same, the notify
+ event is one's own work bouncing back, and can be ignored. (Despite what was
+ said in the preceding paragraph, this is a safe technique.
+ <productname>Postgres</productname> keeps self-notifies separate from notifies
+ arriving from other backends, so you cannot miss an outside notify by ignoring
+ your own notifies.)
+ </para>
+
+ <REFSECT2 ID="R2-SQL-NOTIFY-3">
+ <REFSECT2INFO>
+ <DATE>1998-10-07</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Notes
+ </TITLE>
+ <para>
+ <REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
+ can be any string valid as a name;
+ it need not correspond to the name of any actual table. If
+ <REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
+ is enclosed in double-quotes, it need not even be a syntactically
+ valid name, but can be any string up to 31 characters long.
+ </para>
+ <para>
+ In some previous releases of
+ <productname>Postgres</productname>,
+ <REPLACEABLE CLASS="PARAMETER">notifyname</REPLACEABLE>
+ had to be enclosed in double-quotes when it did not correspond to any existing
+ table name, even if syntactically valid as a name. That is no longer required.
+ </para>
+ <para>
+ In <productname>Postgres</productname> releases prior to 6.4, the backend
+ PID delivered in a notify message was always the PID of the frontend's own
+ backend. So it was not possible to distinguish one's own notifies from other
+ clients' notifies in those earlier releases.
+ </para>
+ </REFSECT2>
+ </refsect1>
+
+ <REFSECT1 ID="R1-SQL-NOTIFY-2">
+ <TITLE>
+ Usage
+ </TITLE>
+ <PARA>
+ <ProgramListing>
+ -- Configure and execute a listen/notify sequence from psql
+ postgres=> listen virtual;
+ LISTEN
+ postgres=> notify virtual;
+ NOTIFY
+ ASYNC NOTIFY of 'virtual' from backend pid '11239' received
+ </ProgramListing>
+ </para>
+ </REFSECT1>
+
+ <REFSECT1 ID="R1-SQL-NOTIFY-3">
+ <TITLE>
+ Compatibility
+ </TITLE>
+
+ <REFSECT2 ID="R2-SQL-NOTIFY-4">
+ <REFSECT2INFO>
+ <DATE>1998-09-24</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ SQL92
+ </TITLE>
+ <PARA>
+ There is no <command>NOTIFY</command> statement in <acronym>SQL92</acronym>.
+ </para>
+ </refsect2>
+ </refsect1>
</REFENTRY>