9.6. ロックとテーブル

Postgresは、テーブル内のデータに対する 同時アクセスを制御するためにさまざまな種類のロックモードを備えています。 これらのロックの一部は、文の実行前にPostgresが 自動的に行います。それ以外はアプリケーションで使用します。 トランザクション実行時に獲得されたすべてのロックモードは、 そのトランザクションが終了されるまで維持されます。

9.6.1. テーブルレベルロック

AccessShareLock

読み込みロックはテーブルが問い合わせが行われたときに 自動的に獲得されます。

AccessExclusiveLockモードのみコンフリクトします。

RowShareLock

SELECT FOR UPDATE文と、 IN ROW SHARE MODELOCK TABLE文 によって獲得されます。

ExclusiveLockモードとAccessExclusiveLockモードでコンフリクトします。

RowExclusiveLock

UPDATEDELETEINSERTLOCK TABLEIN ROW EXCLUSIVE MODEによって獲得されます。

ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLockで コンフリクトします。

ShareLock

CREATE INDEXLOCK TABLEテーブルの IN SHARE MODEによって獲得されます。

ExclusiveLock、ShareRowExclusiveLock、ExclusiveLock、 AccessExclusiveLockでコンフリクトします。

ShareRowExclusiveLock

LOCK TABLEIN SHARE ROW EXCLUSIVE MODE によって獲得します。

RowExclusiveLock、ShareLock、ShareRowExclusiveLock、 ExclusiveLock、ShareLock、ShareRowExclusiveLockでコンフリクトします。

ExclusiveLock

LOCK TABLEテーブルの IN EXCLUSIVE MODEによって獲得します。

RowShareLock、RowExclusiveLock、ShareLock、ShareRowExclusiveLock、 ExclusiveLock、AccessExclusiveLockでコンフリクトします。

AccessExclusiveLock

ALTER TABLEDROP TABLEVACUUMLOCK TABLEによって獲得します。

すべてのモード(AccessShareLock、RowShareLock、RowExclusiveLock、 ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLock) で獲得します。

Note: AccessExclusiveLockだけがSELECT (FOR UPDATEなし)を阻止します。

9.6.2. 行レベルロック(Row-level locks)

行レベルロックは行が更新された時(または削除、更新のために印が付けられた時)に 獲得されます。行レベルロックはデータの問い合わせに影響を与えません。 同じ行への書き込みのみを阻止します。

Postgresは、メモリに変更された行の情報を 記憶してませんので、同時にロックできる行数の上限はありません。 しかし、行をロックする際に、ディスクに書き込む作業が発生するかも しれません。したがって、例えばSELECT FOR UPDATEは 選択された行に、印を付けるように変更させ、ディスクにそのことを 書き込むことになります。

テーブルと行ロックに加え、短期の共有/排他ロック(share/exclusive lock) があり、これらはシェアドバッファプールにあるテーブルページへの 読み書きのアクセスを管理するために使用されます。これらのロックは タプルが取得されたときや更新されたときに、即座に解除されます。 アプリケーション開発者は特にページレベルロックを考慮する必要はありません。