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