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