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