Manpages

NAME

LOCK - 明 确 地 锁 定 一 个 表

SYNOPSIS

LOCK [ TABLE ] name [, ...] [ IN lockmode MODE ]

where lockmode is one of:

ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

DESCRIPTION 描 述

LOCK TABLE 获 取 一 个 表 级 锁 , 必 要 时 等 待 任 何 冲 突 的 锁 释 放 。 一 旦 获 取 了 这 个 锁 , 它 就 会 在 当 前 事 务 的 余 下 部 分 一 直 保 持 。 ( 没 有 UNLOCK TABLE 命 令 ; 锁 总 是 在 事 务 结 尾 释 放 。 ) 在 为 那 些 引 用 了 表 的 命 令 自 动 请 求 锁 的 时 候 , PostgreSQL 总 是 尽 可 能 使 用 最 小 限 制 的 锁 模 式 。 LOCK TABLE 是 为 你 在 需 要 更 严 格 的 锁 的 场 合 提 供 的 。 例 如 , 假 设 一 个 应 用 在 读 已 提 交 隔 离 级 别 上 运 行 事 务 , 并 且 它 需 要 保 证 在 表 中 的 数 据 在 事 务 的 运 行 过 程 中 都 存 在 。 要 实 现 这 个 目 的 , 你 可 以 在 查 询 之 前 对 表 使 用 SHARE 锁 模 式 进 行 锁 定 。 这 样 将 保 护 数 据 不 被 并 行 修 改 并 且 为 任 何 更 进 一 步 的 对 表 的 读 操 作 提 供 实 际 的 当 前 状 态 的 数 据 , 因 为 SHARE 锁 模 式 与 任 何 写 操 作 需 要 的 ROW EXCLUSIVE 模 式 冲 突 , 并 且 你 的 LOCK TABLE name IN SHARE MODE 语 句 将 等 到 所 有 并 行 的 写 操 作 提 交 或 回 卷 后 才 执 行 。 因 此 , 一 旦 你 获 得 该 锁 , 那 么 就 不 会 存 在 未 提 交 的 写 操 作 . 如 果 运 行 在 可 串 行 化 隔 离 级 别 并 且 你 需 要 读 取 真 实 状 态 的 数 据 时 , 你 必 须 在 执 行 任 何 数 据 修 改 语 句 之 前 运 行 一 个 LOCK TABLE 语 句 。 一 个 可 串 行 化 事 务 的 数 据 图 象 将 在 其 第 一 个 数 据 修 改 语 句 开 始 的 时 候 冻 结 住 。 稍 后 的 LOCK TABLE 将 仍 然 阻 止 并 发 的 写 - - - 但 它 不 能 保 证 事 务 读 取 的 东 西 对 应 最 近 提 交 的 数 值 。 如 果 一 个 此 类 的 事 务 准 备 修 改 一 个 表 中 的 数 据 , 那 么 应 该 使 用 SHARE ROW EXCLUSIVE 锁 模 式 , 而 不 是 SHARE 模 式 。 这 样 就 保 证 任 意 时 刻 只 有 一 个 此 类 的 事 务 运 行 。 不 这 样 做 就 可 能 会 死 锁 : 当 两 个 并 行 的 事 务 可 能 都 请 求 SHARE 模 式 , 然 后 试 图 更 改 表 中 的 数 据 时 , 两 个 事 务 在 实 际 执 行 更 新 的 时 候 都 需 要 ROW EXCLUSIVE 锁 模 式 , 但 是 它 们 无 法 再 次 获 取 这 个 锁 。 ( 请 注 意 , 一 个 事 务 自 己 的 锁 是 从 不 冲 突 的 , 因 此 一 个 事 务 可 以 在 持 有 SHARE 模 式 的 锁 的 时 候 请 求 ROW EXCLUSIVE 模 式 - - 但 是 不 能 在 任 何 其 它 事 务 持 有 SHARE 模 式 的 时 候 请 求 。 ) 为 了 避 免 死 锁 , 所 有 事 务 应 该 保 证 以 相 同 的 顺 序 对 相 同 的 对 象 请 求 锁 , 并 且 , 如 果 涉 及 多 种 锁 模 式 , 那 么 事 务 应 该 总 是 最 先 请 求 最 严 格 的 锁 模 式 。 有 关 锁 模 式 和 锁 定 策 略 的 更 多 信 息 , 请 参 考 Section 12.3 ’’Explicit Locking’’ 。

PARAMETERS 参 数

name 要 锁 定 的 现 存 表 的 名 字 ( 可 以 有 模 式 修 饰 ) 。 命 令

LOCK a, b; 等 效 于 LOCK a; LOCK b;。 表 是 按 照 LOCK 命 令 中 声 明 的 顺 序 一 个 接 一 个 顺 序 上 锁 的 。
lockmode
锁 模 式 声 明 这 个 锁 和 那 些 锁 冲 突 。 锁 模 式 在 Section 12.3 ’’Explicit Locking’’ 里 描 述 。 如 果 没 有 声 明 锁 模 式 , 那 么 使 用 最 严 格 的 模 式 ACCESS EXCLUSIVE。

NOTES 注 意

LOCK ... IN ACCESS SHARE MODE 需 要 在 目 标 表 上 有 SELECT 权 限 。 所 有 其 它 形 式 的 LOCK 需 要 UPDATE 和 /或 DELETE 权 限 。

LOCK 只 是 在 一 个 事 务 块 的 内 部 有 用 ( BEGIN...COMMIT) , 因 为 锁 在 事 务 结 束 的 时 候 马 上 被 释 放 。 出 现 在 任 意 事 务 块 外 面 的 LOCK 都 自 动 生 成 一 个 自 包 含 的 事 务 , 因 此 该 锁 在 获 取 之 后 马 上 被 丢 弃 。

LOCK TABLE 只 处 理 表 级 的 锁 , 因 此 那 些 有 ROW 字 样 的 锁 都 是 用 词 不 当 。 这 些 模 式 名 字 通 常 应 该 应 该 理 解 为 用 户 视 图 在 一 个 被 锁 定 的 表 中 获 取 行 级 的 锁 。 同 样 ROW EXCLUSIVE 模 式 也 是 一 个 可 共 享 的 表 级 锁 。 我 们 一 定 要 记 住 , 只 要 是 涉 及 到 LOCK TABLE, 那 么 所 有 锁 模 式 都 有 相 同 的 语 意 , 区 别 只 是 它 们 与 哪 种 锁 冲 突 的 规 则 。

EXAMPLES 例 子

演 示 在 往 一 个 外 键 表 上 插 入 时 在 有 主 键 的 表 上 使 用 SHARE 的 锁 :

BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films
WHERE name = ’Star Wars: Episode I - The Phantom Menace’;
-- Do ROLLBACK if record was not returned
INSERT INTO films_user_comments VALUES
(_id_, ’GREAT! I was waiting for it for so long!’);
COMMIT WORK; 在 执 行 删 除 操 作 时 对 一 个 有 主 键 的 表 进 行 SHARE ROW EXCLUSIVE 锁 :

BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
(SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;

COMPATIBILITY 兼 容 性

在 SQL 标 准 里 面 没 有 LOCK TABLE , 可 以 使 用 SET TRANSACTION 来 声 明 当 前 事 务 的 级 别 。 PostgreSQL 也 支 持 这 个 , 参 阅 SET TRANSACTION [set_transaction(7)] 获 取 详 细 信 息 。 除 了 ACCESS SHARE, ACCESS EXCLUSIVE, 和 SHARE UPDATE EXCLUSIVE 锁 模 式 外 , PostgreSQL 锁 模 式 和 LOCK TABLE 语 句 都 与 那 些 在 Oracle 里 面 的 兼 容 。

译 者

Postgresql 中 文 网 站 何 伟 平 <laser [AT] pgsqldb.org>

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh