鎖和表
Postgres 提供多種鎖模式來控制對表中數據的並行訪問。有些鎖模式是在語句執行之前由
Postgres
自動施加的,而其他的提供用來由應用使用的。一個事務裡要求的所有鎖模式(除了
AccessShareLock)都是在整個事務期間保有的。
除了鎖以外,短期的共享/排他銷也在共享的緩衝區刈谻於控制對表頁面的讀/寫訪問。銷在一條記錄抓取或者更新後馬上被釋放。
表級鎖
-
AccessShareLock
-
一個內部鎖模式,進行查詢時自動施加在被查詢的表上。語句執行完成後,Postgres
釋放這些鎖。
只與 AccessExclusiveLock 衝突。
-
RowShareLock
-
被 SELECT FOR UPDATE 和用於 IN ROW SHARE MODE 的 LOCK TABLE
語句要求。
與 ExclusiveLock 和 AccessExclusiveLock 模式衝突。
-
RowExclusiveLock
-
被 UPDATE, DELETE, INSERT 和用於IN
ROW EXCLUSIVE MODE 的 LOCK TABLE 語句要求。
與 ShareLock,ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock
模式衝突。
-
ShareLock
-
被 CREATE INDEX 和用於IN SHARE MODE
的 LOCK TABLE 語句所要求。
與 RowExclusiveLock,ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock
模式衝突。
-
ShareRowExclusiveLock
-
被用於 IN SHARE ROW EXCLUSIVE MODE 的
LOCK
TABLE 語句要求。
與 RowExclusiveLock,ShareLock,ShareRowExclusiveLock,ExclusiveLock
和 AccessExclusiveLock 模式衝突。
-
ExclusiveLock
-
被用於 IN EXCLUSIVE MODE 的 LOCK TABLE
語句要求。
與 RowShareLock,RowExclusiveLock,ShareLock,ShareRowExclusiveLock,ExclusiveLock
和 AccessExclusiveLock 模式衝突。
-
AccessExclusiveLock
-
被 ALTER TABLE,DROP TABLE,VACUUM 和 LOCK TABLE 語句要求。
與 RowShareLock,RowExclusiveLock,ShareLock,ShareRowExclusiveLock,ExclusiveLock
和 AccessExclusiveLock 模式衝突。
注意: 只有 AccessExclusiveLock 阻塞 SELECT
(沒有 FOR UPDATE)語句。
行級鎖
當某行的一個內部字段被更新(或刪除或標記為更新)時要求使用這些鎖。
Postgres
在內存裡不做關於已更新的行的任何記憶,因而對鎖定的行數沒有任何限制,也沒有鎖定遞增。
但是,要注意 SELECT FOR UPDATE 會更改所選定的行以標記它們,因而會導致硬碟寫動作。
行級別的鎖不影響數據查詢。它們只是用於阻塞對同一行的寫。
□