⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 notify.sgml

📁 关系型数据库 Postgresql 6.5.2
💻 SGML
字号:
<refentry id="SQL-NOTIFY"> <refmeta>  <refentrytitle id="sql-notify-ref">   NOTIFY  </refentrytitle>  <refmiscinfo>SQL - Language Statements</refmiscinfo> </refmeta> <refnamediv>  <refname>   NOTIFY  </refname>  <refpurpose>   Signals all frontends and backends listening on a notify condition  </refpurpose> </refnamediv> <refsynopsisdiv>  <refsynopsisdivinfo>   <date>1998-10-07</date>  </refsynopsisdivinfo>  <synopsis>NOTIFY <replaceable class="PARAMETER">name</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.       </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><computeroutput>NOTIFY       </computeroutput></term>      <listitem>       <para>	Acknowledgement that notify command has executed.       </para>      </listitem>     </varlistentry>     <varlistentry>      <term><replaceable>Notify events</replaceable></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">name</replaceable>    can be any string valid as a name;    it need not correspond to the name of any actual table.  If    <replaceable class="PARAMETER">name</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">name</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>   Configure and execute a listen/notify sequence from   <application>psql</application>:   <programlisting>LISTEN virtual;NOTIFY virtual;ASYNC NOTIFY of 'virtual' from backend pid '11239' received   </programlisting>  </para> </refsect1> <refsect1 id="R1-SQL-NOTIFY-3">  <title>   Compatibility  </title>  <para>  </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>.   </para>  </refsect2> </refsect1></refentry><!-- Keep this comment at the end of the fileLocal variables:mode: sgmlsgml-omittag:nilsgml-shorttag:tsgml-minimize-attributes:nilsgml-always-quote-attributes:tsgml-indent-step:1sgml-indent-data:tsgml-parent-document:nilsgml-default-dtd-file:"../reference.ced"sgml-exposed-tags:nilsgml-local-catalogs:"/usr/lib/sgml/catalog"sgml-local-ecat-files:nilEnd:-->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -