Re: serial type; race conditions

From: Andrew Perrin <aperrin(at)socrates(dot)berkeley(dot)edu>
To: pgsql(at)symcom(dot)com
Cc: PgSQL-SQL <pgsql-sql(at)postgresql(dot)org>
Subject: Re: serial type; race conditions
Date: 2001-03-29 14:45:42
Message-ID: Pine.LNX.4.21.0103290943290.2599-100000@nujoma.perrins
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

I ditto what Bruce said - trying to get a true sequence without gaps is a
losing battle. Why don't you, instead, use a serial column as the real
sequence, and then a trigger that simply inserts max(foo) + 1 in a
different column? Then when you need to know the column, do something
like:

SELECT number_i_care_about FROM table WHERE serial_number =
currval('serial_number_seq');

ap

----------------------------------------------------------------------
Andrew J Perrin - Ph.D. Candidate, UC Berkeley, Dept. of Sociology
(Soon: Asst Professor of Sociology, U of North Carolina, Chapel Hill)
andrew_perrin(at)unc(dot)edu - http://www.unc.edu/~aperrin

On Thu, 29 Mar 2001, Bruce Momjian wrote:

> > How does currval work if you are not inside a transaction. I have
> > been experimenting with inserting into a table that has a sequence.
> > If the insert fails (not using a transaction) because of bad client input
> > then the next insert gets the proper next number in the sequence.
>
> If you are in a transaction, and the INSERT succeeds but the transaction
> rolls back, the sequence does not get reused. Each backend has a local
> variable that holds the most recent sequence assigned. That is how
> currval works.
>
> >
> > given sequence 1,2,3,4,5 exists
> > insert into table date 1/111/01 (obviously wrong) insert fails...
> > try again with good data, insert succeeds and gets number 6 in the
> > sequence.
> >
> > i'm getting what I want. A sequence number that does not increment
> > on a failed insert. However, how do I get the assigned sequence
> > number with currval when I am not using a transaction? What
> > happens when multiple users are inserting at the same time?
> >
> > I am trying to create a sequence with out any "missing" numbers. If
> > there is a failure to insert, and a sequence number is "taken". I want
> > the empty row.
> >
> > Thanks, .... it is getting clearer....
>
> You really can't use sequences with no gaps. Sequence numbers are not
> _held_ until commit because it would block other backends trying to get
> sequence numbers.
>
> --
> Bruce Momjian | http://candle.pha.pa.us
> pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
> + If your life is a hard drive, | 830 Blythe Avenue
> + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)
>

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Maurizio Ortolan 2001-03-29 14:49:44 Error in the date field (with NULL value...).Thanks!
Previous Message postgresql 2001-03-29 14:41:23 Re: serial type; race conditions