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: "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 07:22:53
Message-ID: D960CB61B694CF459DCFB4B0128514C2025C45E4@exadv11.host.magwien.gv.at (view raw or flat)
Thread:
Lists: pgsql-de-allgemein
Bernd Helmle schrieb:
> > Aufgrund einer Abneigung gegen Exceptions schreibe ich so
> > etwas meist in der Form:
> >
> >| UPDATE Table SET Something = 'something' WHERE ID = 'id';
> >| IF NOT FOUND THEN
> >|   INSERT INTO Table (ID, Something) VALUES ('id', 'something');
> >| END IF;
> 
> ...was aber bei Nebenläufigkeit ohne explizites Locking zu Race Conditions 
> führt. Was ist das Problem an Exceptions?

Sie fressen (laut Doku) Performance, denn intern werden sie mit Savepoints
implementiert.

Es stimmt allerdings, daß zwei solche Statements wie oben einander in die
Quere kommen können.

Allerdings lassen sich auch mit der "INSERT zuerst"-Methode Race Conditions
mit anderen Statements nicht ohne weiteres vermeiden:

CREATE TABLE test (id integer PRIMARY KEY, val text);
INSERT INTO test (id, val) VALUES (1, 'Wert');

Session A:                          Session B:

START TRANSACTION;
SAVEPOINT a;
INSERT INTO test (id, val) VALUES (1, 'Session a');
(ERROR:  duplicate key value violates unique constraint "test_pkey")

                                    DELETE FROM test WHERE id = 1;

ROLLBACK TO a;
UPDATE test SET val = 'Session a' WHERE id = 1;
(UPDATE 0)
COMMIT;

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.

Liebe Grüße,
Laurenz Albe

In response to

Responses

pgsql-de-allgemein by date

Next:From: Markus WannerDate: 2008-08-06 08:09:24
Subject: Re: [pgsql-de-allgemein] RE: [pgsql-de-allgemein] In Funktion prüfen ob Zeile existiert
Previous:From: Andreas 'ads' ScherbaumDate: 2008-08-05 22:50:18
Subject: == Wöchentlicher PostgreSQL Newsletter - 03. Augus 2008 ==

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