Postgres は テーブル内のデータに対する同時アクセスを制御するために,さまざまな種類の ロックを備えています.これらのロックの一部は, 文の実行前に Postgres が自動的に獲得します. それ以外はアプリケーションでの使用を意図しています. AccessShareLock を除き,トランザクション内で獲得されたすべての ロックモードは,そのトランザクション実行の間維持されます.
またロックに加え,共有バッファ内に置かれたテーブルの ページ読み込み/書き込みを制御するために,共有/排他モードの 一時ロック(ラッチ)を採用しています.ラッチは,タプルが フェッチ,または更新されると直ちに開放されます.
問い合わせ対象となるテーブル全体に対して,自動的に獲得される 内部的なロックです.文の実行後, Postgres は直ちにこのロックを開放します.
コンフリクトするロック: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 の各モードのロック
CREATE INDEX および, IN SHARE MODE を指定した LOCK TABLE 文によって獲得されます.
コンフリクトするロック:RowExclusiveLock,ShareRowExclusiveLock, ExclusiveLock そして AccessExclusiveLock の各モードのロック
IN SHARE ROW EXCLUSIVE MODE を指定した LOCK TABLE 文によって獲得されます.
コンフリクトするロック:RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock そして AccessExclusiveLock の各モードのロック
IN EXCLUSIVE MODE を指定した LOCK TABLE 文によって獲得されます.
コンフリクトするロック:RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock,そして AccessExclusiveLock の各モードのロック
ALTER TABLE , DROP TABLE , VACUUM ,および LOCK TABLE 文によって獲得されます.
コンフリクトするロック:RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock そして AccessExclusiveLock の 各モードのロック
Note: FOR UPDATE のない SELECT 文は AccessExclusiveLock モードのロックによってのみブロックされます.
行レベルロックは,行の中のフィールドを更新する場合(あるいは削除, または更新用にマークする場合)に獲得されます. Postgres は,変更した行の情報を メモリ中に残していきません.ですからロックする行数に制限がないにも かかわらず,テーブルロックへの移行(ロックエスカレーション)を 引き起こしたりすることはありません.
ただし,SELECT FOR UPDATE 文は抽出した行に(更新の) マークをつけるので、この文の結果はディスクに書き込まれることに注意 してください。
行レベルロックはデータの問い合わせはブロックせず, 同一行を対象としている複数の書き込み処理同士だけを ブロックします.