Locking Selects
Postgres and other RDBMSes support SELECT FOR SHARE
and SELECT FOR UPDATE
, which allow you to lock a row or set of rows in a table with a
lock.
-
FOR SHARE
locks a row for reads in shared mode, so other sessions can read the rows, but cannot modify them until the current transaction commits. As well, if the rows were updated by a different transaction, thenFOR SHARE
waits until the other transactions have committed before comitting. -
FOR UPDATE
locks a row for writes in exclusive mode, so other transactions are blocked from reading or updating the rows, or doingSELECT FOR SHARE
orSELECT FOR UPDATE
.
These can be enhanced with NOWAIT
and SKIP LOCKED
.
-
NOWAIT
means that any rows with aSELECT FOR SHARE
orSELECT FOR UPDATE
never wait for any locked rows and returns an error if a requested row is locked. -
SKIP LOCKED
never waits to acquire a locked row, and simply continues on without the locked rows.