Reference / Lock Modes / Row lock
Row lock · FU
FOR UPDATE
Definition
FOR UPDATE causes the rows retrieved by the SELECT statement to be locked as though for update. This prevents them from being locked, modified or deleted by other transactions until the current transaction ends. That is, other transactions that attempt UPDATE, DELETE, SELECT FOR UPDATE, SELECT FOR NO KEY UPDATE, SELECT FOR SHARE or SELECT FOR KEY SHARE of these rows will be blocked until the current transaction ends; conversely, SELECT FOR UPDATE will wait for a concurrent transaction that has run any of those commands on the same row, and will then lock and return the updated row (or no row, if the row was deleted). Within a REPEATABLE READ or SERIALIZABLE transaction, however, an error will be thrown if a row to be locked has changed since the transaction started. For further discussion see Data Consistency Checks at the Application Level.
The FOR UPDATE lock mode is also acquired by any DELETE on a row, and also by an UPDATE that modifies the values of certain columns. Currently, the set of columns considered for the UPDATE case are those that have a unique index on them that can be used in a foreign key (so partial indexes and expressional indexes are not considered), but this may change in the future.
Compatibility
Compare different transactions holding locks on the same row.
× Conflicting modes
· Compatible modes
- Conflicts with every mode in this scope.
Commands acquiring this mode
| SQL command | Object, phase and conditions |
|---|---|
| SELECT FOR UPDATE | Lock selected rows, with ROW SHARE on the target table. NOWAIT and SKIP LOCKED affect waiting, not mode compatibility. Source |
| UPDATE (key update) | Used when updating key columns of a unique index usable by a foreign key, excluding partial and expression indexes. Source |
| DELETE | Lock rows being deleted, with ROW EXCLUSIVE on their table. Source |
| MERGE … WHEN MATCHED THEN DELETE / UPDATE (key) | The matched action deletes a row or updates key columns. An insert-only action does not use this row lock. Source |
| INSERT … ON CONFLICT DO UPDATE (key) | The conflict action updates key columns of an existing row. This is not a fixed row lock for every INSERT. Source |
Commands may acquire additional locks. See all command associations.
Other lock modes
Sources
PostgreSQL 18 · Sampled build REL_18_STABLE · 753057e340da. Conflicts, definitions and command associations refer to this fixed source build. SQL links retain the selected version.
Local English manual · Online manual
Pinned source files
- Manual source: explicit locking 753057e340da
- Table lock conflict definitions 753057e340da
- Row lock mode definitions 753057e340da
Source collection date: 2026-09-27.