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
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 == |