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