RE: [pgsql-de-allgemein] In Funktion prüfen ob Zeile 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 Zeile existiert
Date: 2008-08-06 07:22:53
Message-ID: D960CB61B694CF459DCFB4B0128514C2025C45E4@exadv11.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-de-allgemein by date

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