Re: Lock strategies! - Mailing list pgsql-general

From Uwe C. Schroeder
Subject Re: Lock strategies!
Date
Msg-id 200311251607.32950.uwe@oss4u.com
Whole thread Raw
In response to Re: Lock strategies!  ("Marc A. Leith" <marc@redboxdata.com>)
Responses Re: Lock strategies!  (Dave Cramer <pg@fastcrypt.com>)
List pgsql-general
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


Obviously depends on the carrier. Lloyds for example doesn't allow numbering
gaps. But as said: doing it in a fully isolated stored proc usually works.
The stp I use also assembles the alpha part, so I end up with something like
AA-0001234 in a fixed width format.


On Tuesday 25 November 2003 08:40 am, Marc A. Leith wrote:
> Actually, in practice Policy & Certificate 'numbers' only need to be
> unique. Insurance companies (at least those we deal with) have no
> restriction that there can be no holes. In fact, one of our clients has a
> huge gap in the sequence.
>
> Likewise - they aren't usually strictly numeric, consisting of ALPHA and
> NUMERIC components. Ie. AA000001 AA000002 ... AA999999 AB000001.
>
> A better example - is Invoice Numbers. Accountants hate the gaps, since
> they leave room for fraud and make collection difficult.
>
> That said - our implementation for unique ids is either use sequences or to
> encapsulate the logic in a Stored Proc. and ensure that these tranasactions
> are fully isolated.
>
> Marc A. Leith
> redboxdata inc.
>
> E-mail:mleith@redboxdata.com
>
> Quoting "Uwe C. Schroeder" <uwe@oss4u.com>:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > On Monday 24 November 2003 08:01 am, Dave Cramer wrote:
> > > Marcelo,
> > >
> > > You are asking for the impossible.
> > >
> > > In order for sequences to work reliably they have to exist outside of a
> > > transaction, and be atomic. If two transactions asked for a sequence
> > > simultaneously, what number would you give them? If the first one gets
> > > 1, and the second gets 2 how do you roll back the first one and then
> > > give the second one 1?
> > >
> > > And it gets worse, what happens if 10 connections ask for one
> > > simultaneously and then connection 3 7 rollback?
> > >
> > > I don't know how to say this gently, but usually this requirement
> > > suggests that more thinking is required on the application end.
> >
> > Well, there are cases where you have to have the numbers without holes -
> > no matter what. It's not even a matter of the application. Go check your
> > insurance policy: the policy numbers are sequential without holes.
> > Actually you can make that work via stored procedures. But you'd have to
> > lock the table exclusive to avoid duplicates. This still might produce
> > numbering gaps,
> >
> > but you can have the application compensate for that, i.e. if you have a
> > rollback remember the number someplace else and reuse it for the next
> > record.
> >
> > > Dave
> > >
> > > On Mon, 2003-11-24 at 10:48, MaRcElO PeReIrA wrote:
> > > > Dave,
> > > >
> > > > I actually use just the sequence, as you wrote!
> > > >
> > > > The biggest problem it that I *can't* have holes in
> > > > that column, so it was because I used id (serial) and
> > > > forn_id (integer).
> > > >
> > > > All other tables use only the sequence by itself, but
> > > > this one, especially, CAN'T have holes! It is the
> > > > problem!!! ;-)
> > > >
> > > > So, if I rollback or whatever, the ID will be
> > > > populated with the sequence values, but the forn_id
> > > > must increase in a controled way, ie, without holes!
> > > >
> > > > Advices??????
> > > >
> > > > Regards!
> > > >
> > > > Marcelo
> > > >
> > > >  --- Dave Cramer <pg@fastcrypt.com> escreveu: >
> > > > Marceio
> > > >
> > > > > The sequence logic takes care of it. try it yourself
> > > > >
> > > > > open two connections with psql
> > > > >
> > > > > on one do a
> > > > > begin;
> > > > > insert into table
> > > > > select curval('forn_id_seq');
> > > > >
> > > > > on the other
> > > > >
> > > > > do a
> > > > > begin
> > > > > insert into table
> > > > > select curval('forn_id_seq');
> > > > >
> > > > >
> > > > > You will see that they both increment the sequence
> > > > > number
> > > > >
> > > > > you will also see how to get the current value as
> > > > > well.
> > > > >
> > > > > Note, no locking is actually required, you can do
> > > > > this without the
> > > > > transaction stuff, it is there just so you can see
> > > > > it in two sessions at
> > > > > the same time.
> > > > >
> > > > > Also note that a rollback will NOT roll back the
> > > > > sequence number, this
> > > > > will end up with holes but sequences are not
> > > > > guaranteed to not have
> > > > > holes.
> > > > >
> > > > > Why do you have two columns, id, and forn_id, you
> > > > > only need one.
> > > > >
> > > > > and then do an
> > > > >
> > > > > insert into forn (descrip) values ( 'some
> > > > > description' );
> > > > > then select curval('forn_id_seq');
> > > > >
> > > > > forn_id will be populated for you with the value
> > > > > from curval.
> > > > >
> > > > >
> > > > > Dave
> > > > >
> > > > > On Mon, 2003-11-24 at 08:20, MaRcElO PeReIrA wrote:
> > > > > > Hi guys,
> > > > > >
> > > > > > I have a simple table:
> > > > > >
> > > > > > teste=# \d forn
> > > > > >                            Table "public.forn"
> > > > > >  Column  |  Type   |
> > > > >
> > > > > Modifiers
> >
> > ---------+---------+-----------------------------------------------------
> >
> > > >-
> > > >
> > > > > >  id      | integer | not null default
> > > > > > nextval('public.forn_id_seq'::text)
> > > > > >  forn_id | integer |
> > > > > >  descrip | text    |
> > > > > >
> > > > > > Ok! The forn_id is supposed to be sequencial and
> > > > > > without holes (if someone perform a DELETE or
> > > > >
> > > > > UPDATE,
> > > > >
> > > > > > so there will be a hole... no problem if the hole
> > > > > > happens in this case!).
> > > > > >
> > > > > > Well, to know the next value of the forn_id
> > > > >
> > > > > column, it
> > > > >
> > > > > > was planned to be done like this:
> > > > > >
> > > > > > teste=# INSERT INTO forn (forn_id,descrip) VALUES
> > > > > > ((SELECT max(forn_id) FROM forn),'descrip1');
> > > > > >
> > > > > > It will cause a huge delay in case this table
> > > > >
> > > > > became
> > > > >
> > > > > > huge, because the forn_id isn't an indexed column
> > > > >
> > > > > (but
> > > > >
> > > > > > I would index it! The problem I am talking about
> > > > >
> > > > > is
> > > > >
> > > > > > ONLY about the sequence of numbers).
> > > > > >
> > > > > > As a way to be sure it will not another other
> > > > >
> > > > > client
> > > > >
> > > > > > getting the exact value as the max(forn_id), there
> > > > >
> > > > > was
> > > > >
> > > > > > a dirty thing:
> > > > > >
> > > > > > teste=# BEGIN;
> > > > > > teste=# LOCK TABLE forn IN ACCESS EXCLUSIVE MODE;
> > > > > > teste=# INSERT INTO ...
> > > > > > teste=# COMMIT;
> > > > > >
> > > > > > Well, I really think it is not the best way to do
> > > > >
> > > > > that
> > > > >
> > > > > > and I am asking you for advices!
> > > > > >
> > > > > > 1) Is it (... max(forn_id)... ) the best way to
> > > > >
> > > > > get
> > > > >
> > > > > > the next value to be inserted in the table?
> > > > > >
> > > > > > 2) Is there a automatic way to do that?
> > > > > >
> > > > > > Thanks in advance and
> > > > > > Best Regards,
> > > > > >
> > > > > > Marcelo
> > > >
> > > > _____________________________________________________________________
> > > >_
> > > >
> > > > > > Yahoo! Mail: 6MB, anti-spam e antivírus gratuito!
> > > > >
> > > > > Crie sua conta agora:
> > > > > > http://mail.yahoo.com.br
> > > > > >
> > > > > > ---------------------------(end of
> > > > >
> > > > > broadcast)---------------------------
> > > > >
> > > > > > TIP 4: Don't 'kill -9' the postmaster
> > > >
> > > > _____________________________________________________________________
> > > >_
> > > >
> > > > Yahoo! Mail: 6MB, anti-spam e antivírus gratuito! Crie sua conta
> > > > agora: http://mail.yahoo.com.br
> > >
> > > ---------------------------(end of
> > > broadcast)--------------------------- TIP 4: Don't 'kill -9' the
> > > postmaster
> >
> > - --
> >     UC
> >
> > - --
> > Open Source Solutions 4U, LLC    2570 Fleetwood Drive
> > Phone:  +1 650 872 2425        San Bruno, CA 94066
> > Cell:   +1 650 302 2405        United States
> > Fax:    +1 650 872 2417
> > -----BEGIN PGP SIGNATURE-----
> > Version: GnuPG v1.2.1 (GNU/Linux)
> >
> > iD8DBQE/w0/bjqGXBvRToM4RAvZJAJ4980r/Cp+jWSTrHpq7kBRiPpUTIwCfcTUF
> > It3bBNKywCxc3FzOzr7FSyA=
> > =TSWf
> > -----END PGP SIGNATURE-----
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 2: you can get off all lists at once with the unregister command
> >     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org

- --
    UC

- --
Open Source Solutions 4U, LLC    2570 Fleetwood Drive
Phone:  +1 650 872 2425        San Bruno, CA 94066
Cell:   +1 650 302 2405        United States
Fax:    +1 650 872 2417
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE/w+7EjqGXBvRToM4RAvyFAJ4m5WghKaTVdoUDBm4S56HhcgYlJACfVBiu
V/hGezsXsywrsaNdWvrzp1g=
=2S5x
-----END PGP SIGNATURE-----


pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: performance versus order of fields in row
Next
From: Michael A Nachbaur
Date:
Subject: Re: plpgsql question