LISTEN — 監聽通知
LISTEN channel
LISTEN
註冊當前會話為指定通知通道 channel
的監聽器。如果當前會話已在該通知通道上註冊為監聽器,則什麼也不做。
每當呼叫 NOTIFY
命令時(無論是由當前會話還是連線到同一資料庫的其他會話呼叫),當前正在監聽該通知通道的所有會話都會收到通知,並且每個會話會依次通知其連線的客戶端應用程式。channel
可以使用 UNLISTEN
命令取消會話對某個通知通道的註冊。當會話結束時,其監聽註冊會自動清除。
客戶端應用程式必須使用的檢測通知事件的方法取決於它使用的 PostgreSQL 應用程式程式設計介面。使用 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.
SQL 標準中沒有 LISTEN
語句。
如果您在文件中發現任何不正確、與您使用特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。