PostgreSQL
上一頁 第十章. 多版本並行控制 下一頁

鎖和表

Postgres 提供多種鎖模式來控制對表中數據的並行訪問。有些鎖模式是在語句執行之前由 Postgres 自動施加的,而其他的提供用來由應用使用的。一個事務裡要求的所有鎖模式(除了 AccessShareLock)都是在整個事務期間保有的。

除了鎖以外,短期的共享/排他銷也在共享的緩衝區刈谻於控制對表頁面的讀/寫訪問。銷在一條記錄抓取或者更新後馬上被釋放。

表級鎖

AccessShareLock
一個內部鎖模式,進行查詢時自動施加在被查詢的表上。語句執行完成後,Postgres 釋放這些鎖。

只與 AccessExclusiveLock 衝突。

RowShareLock
SELECT FOR UPDATE 和用於IN ROW SHARE MODELOCK TABLE 語句要求。

與 ExclusiveLock 和 AccessExclusiveLock 模式衝突。

RowExclusiveLock
UPDATE, DELETE, INSERT 和用於IN ROW EXCLUSIVE MODELOCK TABLE 語句要求。

與 ShareLock, ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式衝突。

ShareLock
CREATE INDEX 和用於IN SHARE MODELOCK TABLE 語句所要求。

與 RowExclusiveLock, ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式衝突。

ShareRowExclusiveLock
被用於 IN SHARE ROW EXCLUSIVE MODELOCK TABLE 語句要求。

與 RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式衝突。

ExclusiveLock
被用於 IN EXCLUSIVE MODELOCK TABLE 語句要求。

與 RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式衝突。

AccessExclusiveLock
ALTER TABLE, DROP TABLE, VACUUMLOCK TABLE 語句要求。

與 RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式衝突。

注意: 只有 AccessExclusiveLock 阻塞 SELECT (沒有 FOR UPDATE)語句。

行級鎖

當某行的一個內部字段被更新(或刪除或標記為更新)時要求使用這些鎖。Postgres 在內存裡不做關於已更新的行的任何記憶,因而對鎖定的行數沒有任何限制,也沒有鎖定遞增。

但是,要注意 SELECT FOR UPDATE 會更改所選定的行以標記它們,因而會導致硬碟寫動作。

行級別的所不影響數據查詢。它們只是用於阻塞對同一行 的寫。


上一頁 首頁 下一頁
可串行化隔離級別 開頭 鎖和索引