NOTIFY
是一个实用程序命令,用于向连接到同一数据库并侦听使用 LISTEN
命令指定的通道的其他会话发送通知。
NOTIFY
一直存在于 PostgreSQL 中。
用法
通过执行 NOTIFY
,或者从 (PostgreSQL 9.0) 开始的另一种方法 channel
NOTIFY
,通知将传递给侦听该通道的所有会话(使用 channel
, 'message'
LISTEN
命令)。在下一次执行查询时,侦听会话将接收通知。通知可以选择包含消息。
NOTIFY 和事务
NOTIFY
在事务的上下文中运行。只有在事务提交后才会传输通知,如果事务回滚,则不会发送通知。
pg_notify()
函数 pg_notify()
提供与 NOTIFY
相同的功能,并可以根据表或表达式派生的值执行通知。
统计信息
从 PostgreSQL 13 开始,pg_stat_slru
返回的 Notify
记录包含有关 NOTIFY
用法的统计信息。
更改历史
- PostgreSQL 9.0
- (提交 d1e02722)
示例
基本的 NOTIFY
用法示例
postgres=# NOTIFY foo; NOTIFY
这会向侦听通道 foo
的所有会话发送通知,并在它们执行查询时接收。
postgres=# LISTEN foo; LISTEN postgres=# SELECT pg_backend_pid(); pg_backend_pid ---------------- 23711 (1 row) Asynchronous notification "foo" received from server process with PID 20679.
如果会话正在侦听该通道,则它将接收自己的通知。
postgres=# LISTEN foo; LISTEN postgres=# NOTIFY foo; NOTIFY Asynchronous notification "foo" received from server process with PID 20679. postgres=# NOTIFY foo;
为了简化后续示例,它们将显示为会话侦听其自身通道。
可以选择使用最多 7999
字节的消息传递通知。
postgres=# NOTIFY foo, 'hello world'; NOTIFY Asynchronous notification "foo" with payload "hello world" received from server process with PID 20679.
消息必须指定为字符串(不能为 NULL
),但如果字符串为空,则 NOTIFY
的行为就像没有提供消息一样。
postgres=# NOTIFY foo, NULL; ERROR: syntax error at or near "NULL" LINE 1: NOTIFY foo, NULL; ^ postgres=# NOTIFY foo, ''; NOTIFY Asynchronous notification "foo" received from server process with PID 20679.
如果字符串超过最大长度(默认为 7999
字节),则会引发错误。
postgres=# NOTIFY 'foo', '... very long message ...
';
ERROR: payload string too long
消息字符串必须作为文字提供;无法从表达式(例如通过连接或作为函数的结果)生成它们。
postgres=# NOTIFY foo, 'foo' || 'bar'; ERROR: syntax error at or near "||" LINE 1: NOTIFY foo, 'foo' || 'bar'; ^ postgres=# NOTIFY foo, REPEAT('bar', 2); ERROR: syntax error at or near "REPEAT" LINE 1: NOTIFY foo, REPEAT('foo', 2); ^
但是,可以使用 pg_notify()
实现此目的。
只有在事务提交后才会发送通知。
postgres=# BEGIN; BEGIN postgres=*# NOTIFY foo, 'hello world'; NOTIFY postgres=*# COMMIT; COMMIT Asynchronous notification "foo" with payload "hello world" received from server process with PID 20679.
如果事务回滚,则不会发送通知。
postgres=# BEGIN; BEGIN postgres=*# NOTIFY foo, 'hello world'; NOTIFY postgres=*# ROLLBACK ; ROLLBACK
参考文献
- PostgreSQL 文档: NOTIFY