LISTEN
是一个实用程序命令,它将当前会话注册为命名通道上的监听器。
LISTEN
一直存在于 PostgreSQL 中。
用法
命名通道必须是有效的 SQL 标识符。
一旦执行了 LISTEN
,来自另一个会话的任何挂起的通知将在下次执行命令时接收。
函数 pg_listening_channels()
返回会话当前正在监听的所有通道的列表。
执行 UNLISTEN
以停止监听命名通道。channelname
LISTEN 和事务
LISTEN
在事务的上下文中运行,并且只有在事务提交后才会生效。如果事务回滚,则该命令将无效。
更改历史记录
- PostgreSQL 9.0
- 将进程间消息传递系统转换为基于内存的队列(提交 d1e02722)
示例
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