暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Halo数据之SQL命令--LISTEN

原创 贾桂军 2024-03-25
104

LISTEN

LISTEN — 监听一个通知

 

大纲

LISTEN channel

 

描述

LISTEN在名为channel的通知频道上将当前会话注册为一个监听者。如果当前会话已经被注册为这个通知频道的一个监听者,则什么也不会发生。

只要命令NOTIFY channel被调用(不管是在这个会话还是在另一个连接到同一数据库的会话中),所有当前正在该通知频道上监听的会话都会被通知,并且每一个会话将会接着通知连接到它的客户端应用。

可以使用UNLISTEN命令在一个给定通知频道上反注册一个会话。当会话结束时,它的监听注册会被自动清除。

一个客户端应用检测通知事件的必用方法取决于它使用的Halo应用编程接口。如果使用libpq库,应用会将LISTEN作为一个普通 SQL 命令发出,并且接着必须周期性地调用函数PQnotifies来查看是否接收到通知事件。其他诸如libpgtcl的接口提供了更高层次上的处理通知事件的方法。事实上,通过使用libpgtcl应用程序员甚至不必直接发出LISTEN或UNLISTEN。更多细节可参阅所使用的接口的文档。

 

参数

channel

一个通知频道的名称(任意标识符)。

 

注解

LISTEN在事务提交时生效。如果在一个后来被回滚的事务中执行了LISTEN或UNLISTEN,被监听的通知频道集合不会变化。

一个已经执行了LISTEN的事务不能为两阶段提交做准备。

第一次设置侦听会话时有一个竞争条件:如果并发提交的事务正在发送通知事件,那么新的侦听会话将接收哪些事件?答案是,会话将接收在事务提交步骤中的一瞬间之后所有提交的事件。但这比事务在查询中可能观察到的任何  数据库状态都要晚一些。这将导致使用LISTEN的以下规则:首先执行(并提交!)该命令,然后在一个新事务中根据应用程序逻辑的需要检查数据库状态,然后依靠通知来了解数据库状态的后续更改。最初收到的几个通知可能涉及在初始数据库检查中已经观察到的更新,但这通常是无害的。

NOTIFY对LISTEN和NOTIFY的使用进行了更广泛的讨论。

 

例子

从psql中配置并执行一个监听/通知序列

LISTEN virtual;

NOTIFY virtual;

Asynchronous notification "virtual" received from server process with PID 8448.

 

参见

NOTIFY, UNLISTEN

最后修改时间:2024-03-25 09:18:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论