diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-12-01 20:50:06 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-12-01 20:50:06 +0000 |
commit | 1eaf9ef62a4cc16ec87b412773981ff77003b38d (patch) | |
tree | 8ac36841cadd7797873747c8108661ca3ef01537 | |
parent | 8462c4a5b4cff1d5fa9e83576575140874b11ee8 (diff) | |
download | postgresql-1eaf9ef62a4cc16ec87b412773981ff77003b38d.tar.gz postgresql-1eaf9ef62a4cc16ec87b412773981ff77003b38d.zip |
Document the recently-understood hazard that a rollback can release row-level
locks that logically should not be released, because when a subtransaction
overwrites XMAX all knowledge of the previous lock state is lost. It seems
unlikely that we will be able to fix this before 8.3...
-rw-r--r-- | doc/src/sgml/ref/select.sgml | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml index c528010723b..172345e412a 100644 --- a/doc/src/sgml/ref/select.sgml +++ b/doc/src/sgml/ref/select.sgml @@ -1,5 +1,5 @@ <!-- -$PostgreSQL: pgsql/doc/src/sgml/ref/select.sgml,v 1.80.4.2 2005/04/22 15:53:27 momjian Exp $ +$PostgreSQL: pgsql/doc/src/sgml/ref/select.sgml,v 1.80.4.3 2006/12/01 20:50:06 tgl Exp $ PostgreSQL documentation --> @@ -819,6 +819,38 @@ FOR UPDATE [ OF <replaceable class="parameter">table_name</replaceable> [, ...] </para> <para> + <literal>FOR UPDATE</literal> may appear before + <literal>LIMIT</literal> for compatibility with + <productname>PostgreSQL</productname> versions before 7.3. It + effectively executes after <literal>LIMIT</literal>, however, and + so that is the recommended place to write it. + </para> + + <caution> + <para> + Avoid locking a row and then modifying it within a later savepoint or + <application>PL/pgSQL</application> exception block. A subsequent + rollback would cause the lock to be lost. For example, +<programlisting> +BEGIN; +SELECT * FROM mytable WHERE key = 1 FOR UPDATE; +SAVEPOINT s; +UPDATE mytable SET ... WHERE key = 1; +ROLLBACK TO s; +</programlisting> + After the <command>ROLLBACK</>, the row is effectively unlocked, rather + than returned to its pre-savepoint state of being locked but not modified. + This hazard occurs if a row locked in the current transaction is updated + or deleted: the former lock state is forgotten. If the transaction is then + rolled back to a state between the original locking command and the + subsequent change, the row will appear not to be locked at all. This is + an implementation deficiency which will be addressed in a future release + of <productname>PostgreSQL</productname>. + </para> + </caution> + + <caution> + <para> It is possible for a <command>SELECT</> command using both <literal>LIMIT</literal> and <literal>FOR UPDATE</literal> clauses to return fewer rows than specified by <literal>LIMIT</literal>. @@ -827,14 +859,7 @@ FOR UPDATE [ OF <replaceable class="parameter">table_name</replaceable> [, ...] Once the <literal>SELECT</> unblocks, the query qualification might not be met and the row not be returned by <literal>SELECT</>. </para> - - <para> - <literal>FOR UPDATE</literal> may appear before - <literal>LIMIT</literal> for compatibility with - <productname>PostgreSQL</productname> versions before 7.3. It - effectively executes after <literal>LIMIT</literal>, however, and - so that is the recommended place to write it. - </para> + </caution> </refsect2> </refsect1> |