LISTEN

一条指示会话监听通知的 SQL 命令

LISTEN 是一个实用程序命令,它将当前会话注册为命名通道上的监听器。

LISTEN 一直存在于 PostgreSQL 中。

用法

命名通道必须是有效的 SQL 标识符。

一旦执行了 LISTEN,来自另一个会话的任何挂起的通知将在下次执行命令时接收。

函数 pg_listening_channels() 返回会话当前正在监听的所有通道的列表。

执行 UNLISTEN channelname 以停止监听命名通道。

LISTEN 和事务

LISTEN 在事务的上下文中运行,并且只有在事务提交后才会生效。如果事务回滚,则该命令将无效。

更改历史记录

示例

LISTEN 的基本用法示例

postgres=# LISTEN foo;
LISTEN

如果从另一个会话执行 NOTIFY,则将在处理下一个命令后接收通知

postgres=# CHECKPOINT;
CHECKPOINT
Asynchronous notification "foo" received from server process with PID 14161.

PostgreSQL 9.0 开始,通知可以包含可选的有效负载

postgres=# SELECT 1;
 ?column? 
----------
        1
(1 row)

Asynchronous notification "foo" with payload "bar" received from server process with PID 14161.

可能会收到多条消息

postgres=# CHECKPOINT ;
CHECKPOINT

Asynchronous notification "foo" with payload "bar" received from server process with PID 14161.
Asynchronous notification "bar" with payload "foo" received from server process with PID 14161.

LISTEN 与事务一起使用

postgres=# BEGIN;
BEGIN

postgres=*# LISTEN foo;
LISTEN

postgres=*# SELECT * FROM pg_listening_channels();
 pg_listening_channels 
-----------------------
(0 rows)

postgres=*# commit;
COMMIT

postgres=# SELECT * FROM pg_listening_channels();
 pg_listening_channels 
-----------------------
 foo
(1 row)

如果事务回滚,则会话将不会监听命名通道(除非它在事务开始之前已注册)

postgres=# SELECT * FROM pg_listening_channels();
 pg_listening_channels 
-----------------------
 foo
(1 row)

postgres=# BEGIN;
BEGIN

postgres=*# LISTEN bar;
LISTEN

postgres=*# LISTEN foo;
LISTEN

postgres=*# ROLLBACK ;
ROLLBACK

postgres=# SELECT * FROM pg_listening_channels();
 pg_listening_channels 
-----------------------
 foo
(1 row)

通道名称必须是最大 63 个 (NAMEDATALEN) 字符的有效 SQL 标识符(多余的字符将被截断)

postgres=# LISTEN 123;
ERROR:  syntax error at or near "123"
LINE 1: LISTEN 123;

postgres=# LISTEN ABCD012345678901234567890123456789012345678901234567890123456789;
NOTICE:  identifier "abcd012345678901234567890123456789012345678901234567890123456789" will be truncated to "abcd01234567890123456789012345678901234567890123456789012345678"
LISTEN
  • PostgreSQL 文档: LISTEN

分类

异步通知实用程序命令

另请参阅

UNLISTENNOTIFYpg_listening_channels()max_notify_queue_pagestrace_notify

反馈

提交任何关于 "LISTEN" 的评论、建议或更正 此处