PostgreSQLのロック(Lock)モード

ここでデータベースの行ロックとテーブルロックについて書きましたが、実際selectとかupdateのコマンドを送ったときにどういうロック状態になるか調べたのでメモ。

PostgreSQL(8.3.1)のみ。ここにあるのを表にしただけ。

注意点としては、これらのロックモードはテーブルレベルで保持しているため、例えばROW EXCLUSIVEモードは同じテーブルの別の行に対しては競合しないが、同じ行に対しての更新処理に関しては、後にモードを取得しようとしたコマンドが待たされる。

ロックモード 説明 競合するモード コマンド
ACCESS SHARE 最も制限の弱いロックモード ACCESS EXCLUSIVE SELECT
ROW SHARE 行単位に共有ロック EXCLUSIVE,
ACCESS EXCLUSIVE
SELECT FOR UPDATE
ROW EXCLUSIVE 行単位に排他ロック SHARE,
SHARE ROW EXCLUSIVE,
EXCLUSIVE,
ACCESS EXCLUSIVE
UPDATE,
DELETE,
INSERT
SHARE UPDATE EXCLUSIVE 同時実行されるスキーマの変更およびVACUUM コマンドの実行から、テーブルを保護 SHARE UPDATE EXCLUSIVE,
SHARE,
SHARE ROW EXCLUSIVE,
EXCLUSIVE、
ACCESS EXCLUSIVE
(FULLなしの)VACUUM
SHARE テーブル全体に共有ロック ROW EXCLUSIVE,
SHARE ROW EXCLUSIVE、EXCLUSIVE、
ACCESS EXCLUSIVE
CREATE INDEX
SHARE ROW EXCLUSIVE 同時1個のトランザクションのみ取得可能 ROW EXCLUSIVE、SHARE、
SHARE ROW EXCLUSIVE、EXCLUSIVE、
ACCESS EXCLUSIVE
 
EXCLUSIVE テーブル全体に排他ロック(selectのみ可能) ROW SHARE、
ROW EXCLUSIVE,
SHARE,
SHARE ROW EXCLUSIVE,
EXCLUSIVE,
ACCESS EXCLUSIVE
 
ACCESS EXCLUSIVE 最も制限の強いロックモード。同時に起こる全ての操作からロックしたテーブルを保 護 全てのモード ALTER TABLE, DROP TABLE, VACUUM

さらにロック処理やトランザクションについて知りたい場合は、ここの事務員の方の説明がわかりやすい。MVCCVACUUMについても例を交えて説明されているので、一度は読んどくといいかも。