<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v 1.61 2002/09/21 18:32:54 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v 1.62 2002/10/18 18:26:22 tgl Exp $
PostgreSQL documentation
-->
</para>
<para>
- The FOR UPDATE clause allows the SELECT statement to perform
- exclusive locking of selected rows.
+ The FOR UPDATE clause causes the SELECT statement to lock the selected
+ rows against concurrent updates.
</para>
<para>
You must have SELECT privilege to a table to read its values
(See the <command>GRANT</command>/<command>REVOKE</command> statements).
+ Use of FOR UPDATE requires UPDATE privilege as well.
</para>
<refsect2 id="SQL-FROM">
<para>
FOR UPDATE causes the rows retrieved by the query to be locked as though
for update. This prevents them from being modified or deleted by other
- transactions until the current transaction ends.
+ transactions until the current transaction ends; that is, other
+ transactions that attempt UPDATE, DELETE, or SELECT FOR UPDATE of these
+ rows will be blocked until the current transaction ends. Also, if an
+ UPDATE, DELETE, or SELECT FOR UPDATE from another transaction has already
+ locked a selected row or rows, SELECT FOR UPDATE will wait for the other
+ transaction to complete, and will then lock and return the updated row
+ (or no row, if the row was deleted). For further discussion see the
+ concurrency chapter of the <citetitle>User's Guide</citetitle>.
</para>
<para>
If specific tables are named in FOR UPDATE, then only rows coming from
- those tables are locked.
+ those tables are locked; any other tables used in the SELECT are simply
+ read as usual.
</para>
<para>
FOR UPDATE cannot be used in contexts where returned rows can't be clearly
identified with individual table rows; for example it can't be used with
- aggregation. FOR UPDATE may also appear before LIMIT for portability with
- pre-7.3 applications.
+ aggregation.
+ </para>
+
+ <para>
+ FOR UPDATE may appear before LIMIT for compatibility with
+ pre-7.3 applications. However, it effectively executes after LIMIT,
+ and so that is the recommended place to write it.
</para>
</refsect2>