See 'merge_db' in http://lnk.nu/postgresql.org/5sl.html

On Fri, Nov 11, 2005 at 10:07:07PM -0500, Rod Taylor wrote:
> On Fri, 2005-11-11 at 18:36 -0500, [EMAIL PROTECTED] wrote:
> > On Fri, Nov 11, 2005 at 06:00:32PM -0500, Rod Taylor wrote:
> > > So? That is what save points are for.  You can even skip the select for
> > > update if you don't mind dead tuples from the attempted insert.
> > > SELECT ... FOR UPDATE;
> > > IF not exists THEN
> > >   SAVEPOINT;
> > >   INSERT ;
> > >   IF UNIQUE VIOLATION THEN
> > >           /* Someone else inserted between the SELECT and our INSERT */
> > >           ROLLBACK TO SAVEPOINT;
> > >           UPDATE;
> > >   ELSE
> > >           RELEASE SAVEPOINT;
> > >   FI
> > > ELSE
> > >   UPDATE;
> > > FI
> > 
> > Isn't there still a race between INSERT and UPDATE?
> 
> I suppose there is although I hadn't noticed before. I've never run into
> it and always check to ensure the expected number of tuples were touched
> by the update or delete.
> 
> Within the PostgreSQL backend you might get away with having your insert
> hold a lock on the index page and follow it up with a FOR UPDATE lock on
> the offending tuple thus ensuring that your update will succeed. If you
> hack index mechanisms for the support you don't need the SAVEPOINT
> either -- just don't throw an error when you run across the existing
> entry.
> 
> For client side code one possibility is to repeat until successful.
> 
> WHILE
>       SELECT FOR UPDATE;
>       IF NOT EXISTS THEN
>               SAVEPOINT
>               INSERT;
>               IF UNIQUE VIOLATION THEN
>                       ROLLBACK TO SAVEPOINT;
>               ELSE
>                       RELEASE SAVEPOINT
>                       EXIT;
>               FI
>       ELSE
>               UPDATE;
>               EXIT;
>       END
> 
>       -- Check for infinite loop
> END
> 
> -- 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
>        subscribe-nomail command to [EMAIL PROTECTED] so that your
>        message can get through to the mailing list cleanly
> 

-- 
Jim C. Nasby, Sr. Engineering Consultant      [EMAIL PROTECTED]
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to