2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

LISTEN

LISTEN — 监听通知

概要

LISTEN channel

描述

LISTEN 注册当前会话为指定通知通道 channel 的监听器。如果当前会话已在该通知通道上注册为监听器,则什么也不做。

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

可以使用 UNLISTEN 命令取消会话对某个通知通道的注册。当会话结束时,其监听注册会自动清除。

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

参数

channel

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

注释

LISTEN 在事务提交时生效。如果 LISTENUNLISTEN 在一个后来回滚的事务中执行,那么正在监听的通知通道集将保持不变。

已执行 LISTEN 的事务不能为两阶段提交做好准备。

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

NOTIFY 包含对 LISTENNOTIFY 用法的更广泛的讨论。

示例

配置并执行来自 psql 的监听/通知序列

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

兼容性

SQL 标准中没有 LISTEN 语句。

提交更正

如果您在文档中发现任何不正确、与您使用特定功能时的体验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。