Skip site navigation (1) Skip section navigation (2)

RE: [pgsql-de-allgemein] In Funktion prüfen ob Zei?==?iso-8859-1?Q?le existiert

From: "Albe Laurenz" <laurenz(dot)albe(at)wien(dot)gv(dot)at>
To: "Markus Wanner *EXTERN*" <markus(at)bluegap(dot)ch>
Cc: "Bernd Helmle *EXTERN*" <mailings(at)oopsware(dot)de>,"Tim Landscheidt" <tim(at)tim-landscheidt(dot)de>,<pgsql-de-allgemein(at)postgresql(dot)org>
Subject: RE: [pgsql-de-allgemein] In Funktion prüfen ob Zei?==?iso-8859-1?Q?le existiert
Date: 2008-08-06 08:30:29
Message-ID: D960CB61B694CF459DCFB4B0128514C2025C4655@exadv11.host.magwien.gv.at (view raw or flat)
Thread:
Lists: pgsql-de-allgemein
Markus Wanner schrieb:
> > Wenn man die Transaktion in Session A serealisierbar macht
> > (START TRANSACTION ISOLATION LEVEL SERIALIZABLE in Session A),
> > wird der Erfolg auch nicht glücklich machen, dann bekommt die
> > Session A einen Error 40001.
> 
> ..was doch ein SERIALIZATION FAILURE, und deshalb absolut korrekt ist an 
> der Stelle. Bau auf Seite der Applikation einen retry-loop um die ganze 
> Veranstaltung und gut (und performant).

Ja, das ist völlig korrekt.
Ich wollte ja nur erwähnen, daß es noch ein paar andere Dinge zu
bedenken gibt.

Und mit einem nachträglichen Test könnte man auch die
"UPDATE first"-Methode krisensicher machen: Aktion wiederholen,
wenn das INSERT eine primary key violation ergibt.
Auch wenn das vielleicht weniger hübsch ist.

> Im READ COMMITTED mode waere die Alternative noch, mit SELECT .. FOR 
> UPDATE zu testen, ob's solch ein Tuple schon gibt. Wenn ja, ein UPDATE 
> drauf, wenn nein den INSERT. Weniger performant als SERIALIZABLE 
> (pessimistic locking), aber Du sparst Dir damit evtl. den retry-loop in 
> der App (zumindest wenn Du auch noch darauf achtest, keine deadlocks zu 
> provozieren).

Session A:                            Session B:

START TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT 1 FROM test WHERE id = 1 FOR UPDATE;

 ?column? 
----------
(0 rows)
                                      START TRANSACTION ISOLATION LEVEL READ COMMITTED;
                                      SELECT 1 FROM test WHERE id = 1 FOR UPDATE;

                                       ?column?
                                      ----------
                                      (0 rows)

INSERT INTO test (id, val) VALUES (1, 'Session a');
COMMIT;

                                      INSERT INTO test (id, val) VALUES (1, 'Session b');

                                      ERROR:  duplicate key value violates unique constraint "test_pkey"

Liebe Grüße,
Laurenz Albe

In response to

pgsql-de-allgemein by date

Next:From: Albe LaurenzDate: 2008-08-06 09:07:52
Subject: RE: [pgsql-de-allgemein] Re: [pgsql-de-allgeme?==?iso-8859-1?Q?in] RE: [pgsql-de-allgemein] In Funktion prü?==?iso-8859-1?Q?fen ob Zeile existiert
Previous:From: Bernd HelmleDate: 2008-08-06 08:26:43
Subject: Re: RE: [pgsql-de-allgemein] In Funktion prüfen ob Zeile existiert

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group