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