テーブルレベルロックモード ACCESS SHARE,ROW SHARE,ROW EXCLUSIVE...
- | ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE |
ACCESS SHARE | | | | | | | | X |
ROW SHARE | | | | | | | X | X |
ROW EXCLUSIVE | | | | | X | X | X | X |
SHARE UPDATE EXCLUSIVE | | | | X | X | X | X | X |
SHARE | | | X | X | | X | X | X |
SHARE ROW EXCLUSIVE | | | X | X | X | X | X | X |
EXCLUSIVE | | X | X | X | X | X | X | X |
ACCESS EXCLUSIVE | X | X | X | X | X | X | X | X |
- 例えばBEGIN; SELECT * FROM t1はACCESS SHAREを獲得する。BEGIN; ALTER TABLE t1 ADD COLUMN x intはACCESS EXCLUSIVEを獲得する
- 上の表にあるようにこの二つのロックは衝突する(X)のでもし先にSELECTを実行していたら、ALTERは実行がブロックされる。SELECTがCOMMITされた後に、ALTERは実行される
参考
https://www.postgresql.org/docs/current/explicit-locking.html#TABLE-LOCK-COMPATIBILITY