↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 会话与参数

SQL COMMAND · 会话与参数

LISTEN

监听通知

listen for a notification

LISTEN会话与参数引入 6.4(基线)现存至 20 devel2 次语法变更

动词
LISTEN
对象
—
引入版本
6.4(基线)
状态
现存
语法变更次数
2
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

LISTEN channel

语法概要

LISTEN channel

PostgreSQL 18 手册 · 查看完整参考页

描述

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

每当命令 NOTIFY channel 被执行时,无论是由当前会话还是由另一个连接到同一数据库的会话执行,所有当前正在监听该通知通道的会话都会收到通知,而每个会话随后都会通知其所连接的客户端应用。

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

客户端应用必须采用何种方法来检测通知事件,取决于它所使用的 PostgreSQL 应用程序编程接口。使用 libpq 库时,应用程序将 LISTEN 作为普通 SQL 命令发出,然后必须定期调用 PQnotifies 函数,以判断是否已经收到任何通知事件。其他接口,例如 libpgtcl,则提供了处理通知事件的更高层方法;事实上,在 libpgtcl 中,应用程序员甚至不应直接发出 LISTEN 或 UNLISTEN。详见所使用接口的相关文档。

参数

channel

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

注解

LISTEN 会在事务提交时生效。如果在随后被回滚的事务中执行了 LISTEN 或 UNLISTEN,则被监听的通知通道集合不会发生变化。

执行过 LISTEN 的事务不能进入两阶段提交的预备状态。

第一次建立监听会话时存在一个竞争条件:如果并发提交的事务正在发送通知事件,那么新开始监听的会话究竟会收到其中哪些事件?答案是,该会话会收到那些在其事务提交步骤中的某个时刻之后提交的所有事件。但这个时刻会略晚于该事务通过查询所能观察到的任何数据库状态。因此,使用 LISTEN 时应遵循如下规则:先执行该命令并提交,然后在一个新事务中按照应用逻辑的需要检查数据库状态,之后再依靠通知来获知数据库状态的后续变化。最初收到的几个通知,可能对应于初次检查数据库时已经观察到的更新,但这通常无害。

NOTIFY 中对 LISTEN 和 NOTIFY 的使用有更详细的讨论。

示例

在 psql 中配置并执行一组 listen/notify 操作:

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

兼容性

SQL 标准中没有 LISTEN 语句。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 17← 16正文更新

    正文更新
  2. PostgreSQL 13← 12正文更新

    正文更新
  3. PostgreSQL 9.0← 8.4语法变化

    + LISTEN channel− LISTEN name正文更新
  4. PostgreSQL 7.4← 7.3正文更新

    正文更新
  5. PostgreSQL 7.3← 7.2正文更新

    正文更新
  6. PostgreSQL 7.2← 7.1正文更新

    正文更新
  7. PostgreSQL 7.1← 7.0文件改名

    sql-listen.htm → sql-listen.html

  8. PostgreSQL 7.0← 6.5正文更新

    正文更新
  9. PostgreSQL 6.5← 6.4语法变化

    + LISTEN name− LISTEN notifyname正文更新

同组命令

命令动词对象版本变动最近变更
SESSIONS & SETTINGS会话与参数8 条↑
DISCARDDISCARD— 9.41 次
丢弃会话状态现存
LISTENLISTEN— 9.02 次
监听通知现存
NOTIFYNOTIFY— 9.02 次
发出一个通知现存
RESETRESET— 8.23 次
将一个运行时参数的值恢复为默认值现存
SETSET— 198 次
更改运行时参数现存
SHOWSHOW— 7.23 次
显示一个运行时参数的值现存
UNLISTENUNLISTEN— 9.02 次
停止监听通知现存
ALTER SYSTEMALTERSYSTEM 111 次
更改服务器配置参数现存