PostgreSQLは、テーブル内のデータに対する同時アクセスを制御するためにさまざまな種類のロックモードを備えています。これらのロックの一部は、文の実行前にPostgreSQLが自動的に行います。それ以外はアプリケーションで使用します。トランザクション実行時に獲得されたすべてのロックモードは、そのトランザクションが終了されるまで維持されます。
読み込みロックモードは、テーブルで問い合わせが行われたときに自動的に獲得されます。
AccessExclusiveLockモードのみコンフリクトします。
SELECT FOR UPDATE文と、 IN ROW SHARE MODEのLOCK TABLE文によって獲得されます。
ExclusiveLockモード、AccessExclusiveLockモードとコンフリクトします。
UPDATE、DELETE、 INSERT、IN ROW EXCLUSIVE MODE の LOCK TABLEによって獲得されます。
ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLock モードとコンフリクトします。
VACUUM (FULLなし)と IN SHARE UPDATE EXCLUSIVE MODE の LOCK TABLE 文によって獲得されます。
ShareUpdateExclusiveLock, ShareLock,ShareRowExclusiveLock, ExclusiveLock、AccessExclusiveLock モードとコンフリクトします。
CREATE INDEX、IN SHARE MODEの LOCK TABLE文によって獲得されます。
RowExclusiveLock、ShareUpdateExclusiveLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLockモードとコンフリクトします。
IN SHARE ROW EXCLUSIVE MODE statements.--> IN SHARE ROW EXCLUSIVE MODE の LOCK TABLE 文によって獲得されます。
RowExclusiveLock、ShareUpdateExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLockモードとコンフリクトします。
IN EXCLUSIVE MODEのLOCK TABLE文によって獲得されます。
RowShareLock、RowExclusiveLock、ShareUpdateExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLock モードとコンフリクトします。
ALTER TABLE、DROP TABLE、 VACUUM FULL、LOCK TABLEによって獲得されます。
全てのモード(AccessShareLock、RowShareLock、RowExclusiveLock、ShareUpdateExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLock)とコンフリクトします。
Note: AccessExclusiveLockだけがSELECT(FOR UPDATEなし)文をブロックします。
行レベルロックは、行が更新されたとき(または削除、更新のために印が付けられたとき)に獲得されます。行レベルロックはデータの問い合わせに影響を与えません。 同じ行への書き込みのみを阻止します。
PostgreSQLは、メモリ上に変更された行の情報を記憶してませんので、同時にロックできる行数の上限はありません。しかし、行をロックする際に、ディスクに書き込む作業が発生するかもしれません。したがって、たとえば SELECT FOR UPDATEは選択された行に、印を付けるように変更させ、ディスクにそのことを書き込むことになります。
テーブルと行ロックに加え、一時的な共有/排他ロックがあり、これらは共有バッファプールにあるテーブルページへの読み書きのアクセスを管理するために使用されます。これらのロックはタプルが取得されたときや更新されたときに、即座に解除されます。アプリケーション開発者は特にページレベルロックを考慮する必要はありません。ロックについて全てを説明したかったためページレベルロックを説明しました。