ロックとテーブル

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

またロックに加え,共有バッファ内に置かれたテーブルの ページ読み込み/書き込みを制御するために,共有/排他モードの 一時ロック(ラッチ)を採用しています.ラッチは,タプルが フェッチ,または更新されると直ちに開放されます.

テーブルレベルロック

AccessShareLock

問い合わせ対象となるテーブル全体に対して,自動的に獲得される 内部的なロックです.文の実行後, Postgres は直ちにこのロックを開放します.

コンフリクトするロック:AccessExclusiveLock モードのロックのみ

RowShareLock

SELECT FOR UPDATE と,ロックのモードが IN ROW SHARE MODELOCK TABLE 文によって獲得されます.

コンフリクトするロック:ExclusiveLock,AccessExclusiveLock モードの ロック

RowExclusiveLock

UPDATEDELETEINSERT および,ロックのモードを IN ROW EXCLUSIVE MODE に指定した LOCK TABLE 文によって獲得されます.

コンフリクトするロック:ShareLock,ShareRowExclusiveLock,ExclusiveLock そして AccessExclusiveLock の各モードのロック

ShareLock

CREATE INDEX および, IN SHARE MODE を指定した LOCK TABLE 文によって獲得されます.

コンフリクトするロック:RowExclusiveLock,ShareRowExclusiveLock, ExclusiveLock そして AccessExclusiveLock の各モードのロック

ShareRowExclusiveLock

IN SHARE ROW EXCLUSIVE MODE を指定した LOCK TABLE 文によって獲得されます.

コンフリクトするロック:RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock そして AccessExclusiveLock の各モードのロック

ExclusiveLock

IN EXCLUSIVE MODE を指定した LOCK TABLE 文によって獲得されます.

コンフリクトするロック:RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock,そして AccessExclusiveLock の各モードのロック

AccessExclusiveLock

ALTER TABLEDROP TABLEVACUUM ,および LOCK TABLE 文によって獲得されます.

コンフリクトするロック:RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock そして AccessExclusiveLock の 各モードのロック

Note: FOR UPDATE のない SELECT 文は AccessExclusiveLock モードのロックによってのみブロックされます.

行レベルロック

行レベルロックは,行の中のフィールドを更新する場合(あるいは削除, または更新用にマークする場合)に獲得されます. Postgres は,変更した行の情報を メモリ中に残していきません.ですからロックする行数に制限がないにも かかわらず,テーブルロックへの移行(ロックエスカレーション)を 引き起こしたりすることはありません.

ただし,SELECT FOR UPDATE 文は抽出した行に(更新の) マークをつけるので、この文の結果はディスクに書き込まれることに注意 してください。

行レベルロックはデータの問い合わせはブロックせず, 同一行を対象としている複数の書き込み処理同士だけを ブロックします.