鎖和表

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 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 會更改所選定的行以標記它們,因而會導致硬碟寫動作。

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