Commit 95282d35 authored by Robert Haas's avatar Robert Haas

Warn more vigorously about the non-transactional behavior of sequences.

Craig Ringer, edited fairly heavily by me
parent f5f8e716
...@@ -829,6 +829,20 @@ ALTER SEQUENCE <replaceable class="parameter">tablename</replaceable>_<replaceab ...@@ -829,6 +829,20 @@ ALTER SEQUENCE <replaceable class="parameter">tablename</replaceable>_<replaceab
the column, so that it will be dropped if the column or table is dropped. the column, so that it will be dropped if the column or table is dropped.
</para> </para>
<note>
<para>
Because <type>smallserial</type>, <type>serial</type> and
<type>bigserial</type> are implemented usings sequences, there may
be "holes" or gaps in the sequence of values which appears in the
column, even if no rows are ever deleted. This is a value allocated
from the sequence is still "used up" even if a row containing that
value is never successfully inserted into the table column. This
may happen, for example, if the inserting transaction rolls back.
See <literal>nextval()</literal> in <xref linkend="functions-sequence">
for details.
</para>
</note>
<note> <note>
<para> <para>
Prior to <productname>PostgreSQL</productname> 7.3, <type>serial</type> Prior to <productname>PostgreSQL</productname> 7.3, <type>serial</type>
......
...@@ -9820,6 +9820,27 @@ nextval('foo'::text) <lineannotation><literal>foo</literal> is looked up at ...@@ -9820,6 +9820,27 @@ nextval('foo'::text) <lineannotation><literal>foo</literal> is looked up at
execute <function>nextval</function> concurrently, each will safely receive execute <function>nextval</function> concurrently, each will safely receive
a distinct sequence value. a distinct sequence value.
</para> </para>
<para>
If a sequence object has been created with default parameters,
successive <function>nextval</function> calls will return successive
values beginning with 1. Other behaviors can be obtained by using
special parameters in the <xref linkend="sql-createsequence"> command;
see its command reference page for more information.
</para>
<important>
<para>
To avoid blocking concurrent transactions that obtain numbers from the
same sequence, a <function>nextval</function> operation is never
rolled back; that is, once a value has been fetched it is considered
used, even if the transaction that did the
<function>nextval</function> later aborts. This means that aborted
transactions might leave unused <quote>holes</quote> in the sequence
of assigned values.
</para>
</important>
</listitem> </listitem>
</varlistentry> </varlistentry>
...@@ -9883,30 +9904,17 @@ SELECT setval('foo', 42, false); <lineannotation>Next <function>nextval</> wi ...@@ -9883,30 +9904,17 @@ SELECT setval('foo', 42, false); <lineannotation>Next <function>nextval</> wi
The result returned by <function>setval</function> is just the value of its The result returned by <function>setval</function> is just the value of its
second argument. second argument.
</para> </para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
If a sequence object has been created with default parameters,
successive <function>nextval</function> calls will return successive values
beginning with 1. Other behaviors can be obtained by using
special parameters in the <xref linkend="sql-createsequence"> command;
see its command reference page for more information.
</para>
<important> <important>
<para> <para>
To avoid blocking concurrent transactions that obtain numbers from the Because sequences are non-transactional, changes made by
same sequence, a <function>nextval</function> operation is never rolled back; <function>setval</function> are not undone if the transaction rolls
that is, once a value has been fetched it is considered used, even if the back.
transaction that did the <function>nextval</function> later aborts. This means
that aborted transactions might leave unused <quote>holes</quote> in the
sequence of assigned values. <function>setval</function> operations are never
rolled back, either.
</para> </para>
</important> </important>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect1> </sect1>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment