Re: fetching unique pins in a high-transaction environment...

From: Richard Broersma Jr <rabroersma(at)yahoo(dot)com>
To: Scott Marlowe <smarlowe(at)g2switchworks(dot)com>, Bobus <roblocke(at)gmail(dot)com>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: fetching unique pins in a high-transaction environment...
Date: 2006-11-06 20:04:06
Message-ID: 328332.90829.qm@web31805.mail.mud.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

> Best practice, to me, is to do a couple things. One, create a sequence
> and set it to the first available pin number. Let's say you have pins
> available from the number 1 to 9999. Create a default sequence, it'll
> start on 1. Then, select nextval('yourseqhere') and use that to fetch
> the pin like so:
>
> begin;
> select nextval('yourseqhere'); -- store in a var
> update pin set date_used=now() where id=$var and date_used IS NULL
>
> If date_used is not null, then someone grabbed it from you. Given that
> we're grabbing them using a sequence, this is unlikely, but you never
> know when things might go south.
>
> Otherwise you just reserved it. Then grab it:
>
> select pin from table where id=$var;
> commit;
>
> if a transaction fails, you might not use a pin, no big loss. Better
> than accidentally giving it out twice.
>
> I'd wrap what I just wrote in a simple pl/pgsql script using security
> definer and set the perms so ONLY the user defined function can get you
> a new pin.

It is my understanding that nexval and even currentval are safe across transactions or even user
sessions. I was curious of the datatype for pin, in the previous example I think that it was
defined as a varchar. Perhaps casting the sequence to a varchar would be the finial step before
updating/inserting the records.

Regards,

Richard Broersma Jr.

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Scott Marlowe 2006-11-06 20:08:12 Re: Database recovery in postgres 7.2.4.
Previous Message Richard Broersma Jr 2006-11-06 19:59:36 Re: Groups and Roles and Users