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