Re: blocking INSERTs

From: Csaba Nagy <nagy(at)ecircle-ag(dot)com>
To: Joseph Shraibman <jks(at)selectacast(dot)net>
Cc: Postgres general mailing list <pgsql-general(at)postgresql(dot)org>
Subject: Re: blocking INSERTs
Date: 2005-06-08 08:14:14
Message-ID: 1118218454.19612.89.camel@coppola.muc.ecircle.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, 2005-06-08 at 05:31, Joseph Shraibman wrote:
> I want to do the following:
>
> BEGIN;
> SELECT ... FROM table WHERE a = 1 FOR UPDATE;
> UPDATE table SET ... WHERE a = 1;
> if that resturns zero then
> INSERT INTO table (...) VALUES (...);
> END;
>
> The problem is that I need to avoid race conditions. Sometimes I get
> primary key exceptions on the INSERT.
>
> I think I need to lock the table in share mode to keep inserts from
> happening, but that blocks vacuums, and blocked vacuums block other
> things behind them. So how do I get around this?
>

I think there's no way to avoid the race condition, I got to this
conclusion while following past discussions (which were many of them,
look for "insert or update" for example).
There is though a solution starting with 8.0, namely you should place a
save point before the inserts which are susceptible to fail, and roll
back to that save point on failure. Then you can update while still
keeping the transaction running. The strategy would be then "insert
first, update if failed".

HTH,
Csaba.

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Együd Csaba 2005-06-08 08:47:55 Where to find translation of Postgres error messages?
Previous Message Rodríguez Rodríguez, Pere 2005-06-08 07:11:39 Re: return two elements