Re: conditional insert

From: Lincoln Yeoh <lyeoh(at)pop(dot)jaring(dot)my>
To: Merlin Moncure <mmoncure(at)gmail(dot)com>
Cc: jhondius(at)rem(dot)nl,Pau Marc Muñoz Torres <paumarc(at)gmail(dot)com>, pgsql-general(at)postgresql(dot)org
Subject: Re: conditional insert
Date: 2011-09-08 14:07:20
Message-ID: 20110908140745.8B0CCB5DBE0@mail.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

At 03:51 AM 9/8/2011, Merlin Moncure wrote:
>yeah -- but you only need to block selects if you are selecting in the
>inserting transaction (this is not a full upsert). if both writers
>are doing:
>begin;
>lock table foo exclusive;
>insert into foo select ... where ...;
>commit;
>
>is good enough. btw even if you are doing upsert pattern
>(lock...select for update...insert/update), you'd be fine with
>straight exclusive locks because the 'for update' lock takes a higher
>lock that is blocked by exclusive. A basic rule of thumb is to try
>and not fully block readers unless absolutely necessary...basically
>maintenance operations.

Yeah it works if all the inserters do the lock table (or select for
update), and provides better performance.

But if you're paranoid and lazy - a full lock will ensure that your
code won't get dupe errors even if someone else's code or manual
control doesn't do the lock table (they might get the dupe errors[1],
but that's their problem ;) ). So your code can safely assume that
any DB errors that occur are those that deserve a full rollback of
everything (which is what Postgresql "likes" by default). This means
fewer scenarios to handle so you don't need to write as much code,
nor document and support as much code ;).

Link.

[1] I'm assuming a unique constraint is present- the locking is to
simplify things.

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Lincoln Yeoh 2011-09-08 14:14:02 Re: conditional insert
Previous Message Sim Zacks 2011-09-08 13:42:54 Re: pivoting data?