Manpages

NAME

NOTIFY - 生 成 一 個 通 知

SYNOPSIS

NOTIFY name

DESCRIPTION 描 述

NOTIFY 命 令 向 當 前 數 據 庫 中 所 有 執 行 過 LISTEN name, 正 在 監 聽 特 定 通 知 條 件 的 前 端 應 用 發 送 一 個 通 知 事 件 。 傳 遞 給 前 端 的 通 知 事 件 包 括 通 知 條 件 名 和 發 出 通 知 的 後 端 進 程 PID。 數 據 庫 設 計 者 有 責 任 定 義 用 於 某 個 數 據 庫 的 條 件 名 和 每 個 通 知 條 件 的 含 義 。 通 常 , 通 知 條 件 名 與 數 據 庫 裏 的 表 的 名 字 相 同 , 通 知 時 間 實 際 上 意 味 着 "我 修 改 了 此 數 據 庫 , 請 看 一 眼 有 什 麼 新 東 西 "。 NOTIFY 和 LISTEN 命 令 並 不 強 制 這 種 聯 繫 。 例 如 , 數 據 庫 設 計 者 可 以 使 用 幾 個 不 同 的 條 件 名 來 標 誌 一 個 表 的 幾 種 不 同 改 變 。

NOTIFY 爲 訪 問 同 一 個 PostgreSQL 數 據 庫 的 一 組 進 程 提 供 了 一 種 簡 單 的 信 號 形 式 或 進 程 間 通 訊 機 制 。 更 高 級 的 機 制 ( 除 了 一 個 簡 單 的 通 知 名 以 外 ) 可 以 通 過 使 用 數 據 庫 中 的 表 從 通 知 者 傳 遞 數 據 到 被 通 知 者 。 當 NOTIFY用 於 通 知 某 一 特 定 表 修 改 的 動 作 的 發 生 , 一 個 實 用 的 編 程 技 巧 是 將 NOTIFY 放 在 一 個 由 表 更 新 觸 發 的 規 則 裏 。 用 這 種 方 法 , 通 知 將 在 表 更 新 的 時 候 自 動 觸 發 , 而 且 應 用 程 序 員 不 會 碰 巧 忘 記 處 理 它 。

NOTIFY 和 SQL 事 務 用 某 種 重 要 的 方 法 進 行 交 換 。 首 先 , 如 果 NOTIFY 在 事 務 內 部 執 行 , 通 知 事 件 直 到 事 務 提 交 纔 會 送 出 。 這 麼 做 是 有 道 理 的 , 因 爲 如 果 事 務 退 出 了 , 那 麼 在 它 裏 面 的 所 有 命 令 都 沒 有 效 果 - 包 括 NOTIFY。 但 如 果 有 人 希 望 通 知 事 件 立 即 發 送 , 這 就 不 太 好 了 。 其 次 , 當 一 個 正 在 監 聽 的 會 話 在 一 次 事 務 內 收 到 一 個 通 知 信 號 , 直 到 本 次 事 務 完 成 ( 提 交 或 退 出 ) 之 前 , 該 通 知 事 件 將 不 被 送 到 與 之 相 連 的 客 戶 端 。 同 樣 , 如 果 一 個 通 知 在 事 務 內 部 發 送 出 去 了 , 而 該 事 務 稍 後 又 退 出 了 , 我 們 就 希 望 通 知 可 以 在 某 種 程 度 上 被 撤 消 - - 但 通 知 一 旦 發 送 出 去 , 服 務 器 便 不 能 從 客 戶 端 "收 回 "通 知 。 所 以 通 知 時 間 只 是 在 事 務 之 間 傳 遞 。 這 一 點 就 要 求 使 用 NOTIFY 作 爲 實 時 信 號 的 應 用 應 該 確 保 他 們 的 事 務 儘 可 能 短 。

NOTIFY 在 一 方 面 的 行 爲 象 Unix 的 信 號 : 如 果 同 一 條 件 名 在 短 時 間 內 發 出 了 多 條 信 號 , 接 收 者 幾 次 執 行 NOTIFY 可 能 只 回 收 到 一 條 通 知 信 息 。 所 以 依 賴 於 收 到 的 通 知 條 數 的 方 法 是 很 不 可 靠 的 。 因 而 , 使 用 NOTIFY喚 醒 需 要 關 注 某 事 的 應 用 , 同 時 還 要 使 用 數 據 庫 對 象 ( 如 序 列 號 ) 來 跟 蹤 事 件 發 生 了 幾 次 。 客 戶 端 經 常 會 自 己 發 送 與 正 在 監 聽 的 通 知 名 一 樣 的 NOTIFY。 這 時 它 ( 客 戶 端 ) 也 和 其 他 正 在 監 聽 的 會 話 一 樣 收 到 一 個 通 知 事 件 。 這 樣 可 能 導 致 一 些 無 用 的 工 作 ( 與 應 用 邏 輯 有 關 ) - - 例 如 , 對 客 戶 端 剛 寫 過 的 表 又 進 行 一 次 讀 操 作 以 發 現 是 否 有 更 新 。 我 們 可 以 通 過 檢 查 服 務 器 進 程 的 PID( 在 通 知 事 件 中 提 供 ) 是 否 與 自 己 的 後 端 的 PID一 致 ( 從 libpq 中 取 得 ) 。 當 他 們 一 樣 時 , 說 明 這 是 其 自 身 回 彈 的 信 息 , 可 以 忽 略 。 ( 不 管 前 面 章 節 是 如 何 講 的 , 這 是 一 個 安 全 的 技 巧 。 PostgreSQL 保 持 自 身 的 通 知 和 其 他 到 來 的 通 知 區 分 開 。 所 以 你 屏 蔽 了 自 己 的 通 知 後 不 會 略 過 外 部 的 通 知 。 )

PARAMETERS 參 數

name 生 成 信 號 ( 通 知 ) 的 通 知 條 件 ( 任 何 標 識 符 ) 。

EXAMPLES 例 子

psql 裏 配 置 和 執 行 一 個 監 聽 /通 知 對 :

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

COMPATIBILITY 兼 容 性

在 SQL 標 準 裏 沒 有 NOTIFY 語 句 。

SEE ALSO 參 見

LISTEN [listen(7)], UNLISTEN [unlisten(l)]

譯 者

Postgresql 中 文 網 站 何 偉 平 <laser [AT] pgsqldb.org>

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh