Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

LISTEN

LISTEN — 监听通知

语法

LISTEN channel

描述

LISTEN 将当前会话注册为名为 channel 的通知通道的监听器。如果当前会话已经作为一个监听器注册到该通知通道,则不执行任何操作。

无论是由此会话还是连接到同一数据库的另一个会话调用了命令 NOTIFY channel,当前监听该通知通道的所有会话都将收到通知,并且每一个都将依次通知其已连接的客户端应用程序。

可以使用 UNLISTEN 命令取消给定通知频道上的会话注册。会话的监听注册在会话结束时自动清除。

客户端应用程序必须用来检测通知事件的方法取决于其使用的 PostgreSQL 应用程序编程接口。使用 libpq 库,应用程序会以普通 SQL 命令的形式发出 LISTEN,然后必须定期调用 PQnotifies 函数以了解是否已收到任何通知事件。其他接口(如 libpgtcl)提供了用于处理通知事件的高级方法,事实上,使用 libpgtcl 时,应用程序员甚至不必直接发出 LISTENUNLISTEN。有关更多详细信息,请参阅正在使用的接口的文档。

参数

channel

通知频道的名称(任何标识符)。

说明

LISTEN 在事务提交时生效。如果在随后会回滚的事务中执行 LISTENUNLISTEN,则正在监听的通知频道组保持不变。

执行过 LISTEN 的事务无法为两阶段提交做好准备。

在第一次设置监听会话时会出现争用条件:如果并发表提交的事务正在发送通知事件,那么新监听会话将收到其中的哪一个?答案是该会话将收到事务提交步骤期间某一时刻之后提交的所有事件。但这比事务在查询中可能观察到的任何数据库状态稍微晚一些。这导致以下有关使用 LISTEN 的规则:首先执行(并提交!)该命令,然后在新事务中根据应用程序逻辑需要检查数据库状态,然后依赖于通知来了解数据库状态的后续更改。收到的前几个通知可能指的是在初始数据库检查中已观察到的更新,但这通常是无害的。

NOTIFYLISTENNOTIFY 的使用进行了更全面的讨论。

示例

psql 配置和执行监听/通知序列

LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.

兼容性

SQL 标准中没有 LISTEN 语句。

另请参阅

NOTIFYUNLISTENmax_notify_queue_pages