Type of lock | Access share | Row share | Row exclusive | Share update exclusive | Share | Share row exclusive | Exclusive | Access exclusive | |
---|---|---|---|---|---|---|---|---|---|
Commands | SELECT ANALYZE |
SELECT FOR UPDATE |
UPDATE DELETE
INSERT |
VACUUM w/o FULL |
CREATE INDEX |
- |
- |
ALTER TABLE
DROP TABLE REINDEX
CLUSTER VACUUM FULL |
|
Access share | SELECT ANALYZE |
X | |||||||
Row share | SELECT FOR UPDATE |
X | X | ||||||
Row exclusive | UPDATE DELETE
INSERT |
X | X | X | X | ||||
Share update exclusive | VACUUM w/o FULL |
X | X | X | X | X | |||
Share | CREATE INDEX |
X | X | X | X | X | |||
Share row exclusive | - |
X | X | X | X | X | X | ||
Exclusive | - |
X | X | X | X | X | X | X | |
Access exclusive | ALTER TABLE
DROP TABLE REINDEX
CLUSTER VACUUM FULL |
X | X | X | X | X | X | X | X |
X | If a transaction holds one table lock, and another transaction requires the other lock, then the second transaction will be blocked until the first transaction ends (eg. by COMMIT or ROLLBACK). |
X | same as above, but those lock types are not used by PostgreSQL |