#

LISTEN — 收听通知

# 概要

LISTEN channel

# 描述

将当前会话注册为名为的通知通道上的侦听器*渠道*.如果当前会话已注册为此通知通道的侦听器,则不执行任何操作。

每当命令通知 *渠道*由该会话或连接到同一数据库的另一个会话调用,当前在该通知通道上侦听的所有会话都会被通知,并且每个会话将依次通知其连接的客户端应用程序。

会话可以取消注册给定的通知通道与不听命令。会话结束时会自动清除会话的监听注册。

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

# 参数

渠道

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

# 笔记

在事务提交时生效。如果或者不听在稍后回滚的事务中执行,正在侦听的通知通道集不变。

已执行的交易无法为两阶段提交做好准备。

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

通知包含对使用的更广泛的讨论通知.

# 例子

从 psql 配置并执行监听/通知序列:

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

# 兼容性

没有SQL 标准中的语句。

# 也可以看看

通知,不听