by <command>SELECT</command> it doesn't mean that this row really
exists at the time it is returned (i.e. sometime after the
statement or transaction began) nor
- that the row is protected from deletion or update by concurrent
+ that the row is protected from deletion or updation by concurrent
transactions before the current transaction does a commit or rollback.
</para>
is required for those wishing to migrate data from any
previous release of <productname>Postgres</productname>.
</para>
- </sect2>
+
+ <para>
+
+ Because readers in 6.5 don't lock data, regardless of transaction
+ isolation level, data read by one transaction can be overwritten by
+ another. In the other words, if a row is returned by
+ <command>SELECT</command> it doesn't mean that this row really exists
+ at the time it is returned (i.e. sometime after the statement or
+ transaction began) nor that the row is protected from deletion or
+ updation by concurrent transactions before the current transaction does
+ a commit or rollback.
+
+ </para>
+
+ <para>
+
+ To ensure the actual existance of a row and protect it against
+ concurrent updates one must use <command>SELECT FOR UPDATE</command> or
+ an appropriate <command>LOCK TABLE</command> statement. This should be
+ taken into account when porting applications from previous releases of
+ <productname>Postgres</productname> and other environments.
+
+ </para>
+
+ <para>
+
+ Keep above in mind if you are using contrib/refint.* triggers for
+ referential integrity. Additional technics are required now. One way is
+ to use <command>LOCK parent_table IN SHARE ROW EXCLUSIVE MODE</command>
+ command if a transaction is going to update/delete a primary key and
+ use <command>LOCK parent_table IN SHARE MODE</command> command if a
+ transaction is going to update/insert a foreign key.
+
+ <note>
+ <para>
+
+ Note that if you run a transaction in SERIALIZABLE mode then you must
+ execute <command>LOCK</command> commands above before execution of any
+ DML statement
+ (<command>SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO</command>) in the
+ transaction.
+
+ </para>
+ </note>
+
+ <para>
+
+ These inconveniences will disappear when the ability to read durty
+ (uncommitted) data, regardless of isolation level, and true referential
+ integrity will be implemented.
+
+ </para>
+
+ </para>
+
+ </sect2>
<sect2>
<title>Detailed Change List</title>
-
<para>
<programlisting>
Bug Fixes