Locking and Tables
Postgres provides various lock modes to control concurrent access to data in tables. Some of these lock modes are acquired by Postgres automatically before statement execution, while others are provided to be used by applications. All lock modes (except for AccessShareLock) acquired in a transaction are held for the duration of the transaction.
In addition to locks, short-term share/exclusive latches are used to control read/write access to table pages in shared buffer pool. Latches are released immediately after a tuple is fetched or updated.
Table-level locks
- AccessShareLock
An internal lock mode acquiring automatically over tables being queried. Postgres releases these locks after statement is done.
Conflicts with AccessExclusiveLock only.
- RowShareLock
Acquired by SELECT FOR UPDATE and LOCK TABLE for IN ROW SHARE MODE statements.
Conflicts with ExclusiveLock and AccessExclusiveLock modes.
- RowExclusiveLock
Acquired by UPDATE, DELETE, INSERT and LOCK TABLE for IN ROW EXCLUSIVE MODE statements.
Conflicts with ShareLock, ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock modes.
- ShareLock
Acquired by CREATE INDEX and LOCK TABLE table for IN SHARE MODE statements.
Conflicts with RowExclusiveLock, ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock modes.
- ShareRowExclusiveLock
Acquired by LOCK TABLE for IN SHARE ROW EXCLUSIVE MODE statements.
Conflicts with RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock modes.
- ExclusiveLock
Acquired by LOCK TABLE table for IN EXCLUSIVE MODE statements.
Conflicts with RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock modes.
- AccessExclusiveLock
Acquired by ALTER TABLE, DROP TABLE, VACUUM and LOCK TABLE statements.
Conflicts with RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock modes.
Note: Only AccessExclusiveLock blocks SELECT (without FOR UPDATE) statement.
Row-level locks
These locks are acquired when internal fields of a row are being updated (or deleted or marked for update). Postgres doesn't remember any information about modified rows in memory and so has no limit to the number of rows locked without lock escalation.
However, take into account that SELECT FOR UPDATE will modify selected rows to mark them and so will results in disk writes.
Row-level locks don't affect data querying. They are used to block writers to the same row only.
Report a documentation issue
Read the upstream documentation. For corrections, first check the current manual.