他のバージョンの文書9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.6. ロックとテーブル

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

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

AccessShareLock

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

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

RowShareLock

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

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

RowExclusiveLock

UPDATEDELETEINSERTIN ROW EXCLUSIVE MODELOCK TABLEによって獲得されます。

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

ShareUpdateExclusiveLock

VACUUM (FULLなし)と IN SHARE UPDATE EXCLUSIVE MODELOCK TABLE 文によって獲得されます。

ShareUpdateExclusiveLock, ShareLock,ShareRowExclusiveLock, ExclusiveLock、AccessExclusiveLock モードとコンフリクトします。

ShareLock

CREATE INDEXIN SHARE MODELOCK TABLE文によって獲得されます。

RowExclusiveLock、ShareUpdateExclusiveLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLockモードとコンフリクトします。

ShareRowExclusiveLock

IN SHARE ROW EXCLUSIVE MODE statements.--> IN SHARE ROW EXCLUSIVE MODELOCK TABLE 文によって獲得されます。

RowExclusiveLock、ShareUpdateExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLockモードとコンフリクトします。

ExclusiveLock

IN EXCLUSIVE MODELOCK TABLE文によって獲得されます。

RowShareLock、RowExclusiveLock、ShareUpdateExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLock モードとコンフリクトします。

AccessExclusiveLock

ALTER TABLEDROP TABLEVACUUM FULLLOCK TABLEによって獲得されます。

全てのモード(AccessShareLock、RowShareLock、RowExclusiveLock、ShareUpdateExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock、AccessExclusiveLock)とコンフリクトします。

Note: AccessExclusiveLockだけがSELECTFOR UPDATEなし)文をブロックします。

9.6.2. 行レベルロック

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

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

テーブルと行ロックに加え、一時的な共有/排他ロックがあり、これらは共有バッファプールにあるテーブルページへの読み書きのアクセスを管理するために使用されます。これらのロックはタプルが取得されたときや更新されたときに、即座に解除されます。アプリケーション開発者は特にページレベルロックを考慮する必要はありません。ロックについて全てを説明したかったためページレベルロックを説明しました。