PostgreSQL 8.2.23 Documentation | ||||
---|---|---|---|---|
Prev | Fast Backward | Fast Forward | Next |
The NOTIFY command sends a notification event to each client application that has previously executed LISTEN name for the specified notification name in the current database.
NOTIFY provides a simple form of signal or interprocess communication mechanism for a collection of processes accessing the same PostgreSQL database. Higher-level mechanisms can be built by using tables in the database to pass additional data (beyond a mere notification name) from notifier to listener(s).
The information passed to the client for a notification event includes the notification name and the notifying session's server process PID. It is up to the database designer to define the notification names that will be used in a given database and what each one means.
Commonly, the notification name is the same as the name of some table in the database, and the notify event essentially means, "I changed this table, take a look at it to see what's new". But no such association is enforced by the NOTIFY and LISTEN commands. For example, a database designer could use several different notification names to signal different sorts of changes to a single table.
When NOTIFY is used to signal the occurrence of changes to a particular table, a useful programming technique is to put the NOTIFY in a rule that is triggered by table updates. In this way, notification happens automatically when the table is changed, and the application programmer can't accidentally forget to do it.
NOTIFY interacts with SQL transactions in some important ways. Firstly, if a NOTIFY is executed inside a transaction, the notify events are not delivered until and unless the transaction is committed. This is appropriate, since if the transaction is aborted, all the commands within it have had no effect, including NOTIFY. But it can be disconcerting if one is expecting the notification events to be delivered immediately. Secondly, if a listening session receives a notification signal while it is within a transaction, the notification event will not be delivered to its connected client until just after the transaction is completed (either committed or aborted). Again, the reasoning is that if a notification were delivered within a transaction that was later aborted, one would want the notification to be undone somehow — but the server cannot "take back" a notification once it has sent it to the client. So notification events are only delivered between transactions. The upshot of this is that applications using NOTIFY for real-time signaling should try to keep their transactions short.
NOTIFY behaves like Unix signals in one important respect: if the same notification name is signaled multiple times in quick succession, recipients may get only one notification event for several executions of NOTIFY. So it is a bad idea to depend on the number of notifications received. Instead, use NOTIFY to wake up applications that need to pay attention to something, and use a database object (such as a sequence) to keep track of what happened or how many times it happened.
It is common for a client that executes NOTIFY to be listening on the same notification name itself. In that case it will get back a notification event, just like all the other listening sessions. Depending on the application logic, this could result in useless work, for example, reading a database table to find the same updates that that session just wrote out. It is possible to avoid such extra work by noticing whether the notifying session's server process PID (supplied in the notification event message) is the same as one's own session's PID (available from libpq). When they are the same, the notification event is one's own work bouncing back, and can be ignored. (Despite what was said in the preceding paragraph, this is a safe technique. PostgreSQL keeps self-notifications separate from notifications arriving from other sessions, so you cannot miss an outside notification by ignoring your own notifications.)
小孩多动症是什么原因引起的 | 为什么一吃饭就拉肚子 | 胰腺炎什么症状 | 游车河什么意思 | 咳嗽可以吃什么食物 |
宅基地是什么意思 | 为什么叫汉族 | 尼姑是什么生肖 | 211是什么大学 | 牛标志的车是什么牌子 |
一什么知什么 | 老打嗝是什么原因 | 月经期不能吃什么水果 | 卧室放什么花最好健康 | 醉代表什么生肖 |
玫瑰和月季有什么区别 | 手发痒是什么原因 | 吃什么长指甲最快 | 什么是生物钟 | 撕漫男是什么意思 |
蝴蝶的翅膀像什么gysmod.com | 霸王餐是什么意思hcv8jop8ns0r.cn | 吃什么能让月经快点来hcv9jop0ns2r.cn | 营养心脏最好的药是什么药hcv8jop6ns1r.cn | 卡西欧手表属于什么档次hcv8jop8ns8r.cn |
不丹为什么不和中国建交zhongyiyatai.com | 常喝普洱茶有什么好处hcv7jop6ns8r.cn | columbia是什么牌子hcv7jop6ns5r.cn | u盘什么牌子好hcv9jop0ns4r.cn | 反驳是什么意思hcv8jop6ns2r.cn |
屁多屁臭是什么原因wuhaiwuya.com | 类风湿是什么意思hcv8jop3ns8r.cn | 子宫内膜厚吃什么食物好hcv7jop4ns5r.cn | 神经衰弱吃什么药最好hcv7jop6ns4r.cn | 张信哲属什么生肖hcv9jop6ns2r.cn |
夜莺是什么鸟hcv9jop3ns6r.cn | 为什么说尽量不戴脚链hcv9jop7ns3r.cn | 山楂搭配什么泡水喝好hcv8jop6ns9r.cn | 癸未日五行属什么hcv8jop9ns4r.cn | 小肚子发胀是什么原因女性naasee.com |