From: | Dimitri Fontaine <dimitri(at)2ndQuadrant(dot)fr> |
---|---|
To: | Ronan Dunklau <rdunklau(at)gmail(dot)com> |
Cc: | "F(dot) BROUARD \/ SQLpro" <sqlpro(at)club-internet(dot)fr>, pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Migration SQL Serveur 2008 vers PostgreSQL |
Date: | 2012-01-05 10:08:53 |
Message-ID: | 87y5tmbgwa.fsf@hi-media-techno.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Ronan Dunklau <rdunklau(at)gmail(dot)com> writes:
> Pour ce point précis, il me semble que la procédure suivante remplit
> le même office, à moins que je n'aie raté un point ?
>
> create or replace function p_insert_transaction(val1 integer) returns
> void as $$
> BEGIN
> BEGIN
> insert into t2 values (val1);
> insert into t1 values (val1);
> EXCEPTION WHEN INTEGRITY_CONSTRAINT_VIOLATION THEN
> insert into t3 values(val1);
> END;
> END;
> $$ language 'plpgsql';
Ah oui tiens c'est dans le bon ordre en fait :)
Ce qui est impossible c'est de COMMIT une partie puis ROLLBACK une autre
de manière indépendante. Sauf si c'est une sous-transaction, on peut
alors utiliser ROLLBACK TO SAVEPOINT.
Le problème se pose donc dans ce cas :
BEGIN;
action-1;
BEGIN;
action-2;
COMMIT;
action-3;
ROLLBACK;
Il faut alors que les actions 1 et 3 soient annulée, et que l'action 2
soit visible. Je ne crois pas qu'il soit possible de faire ça nativement
en plpgsql, même si c'est facile à faire avec plproxy ou dblink.
L'exemple qui fonctionne bien avec du commit suivi de rollback :
BEGIN;
SAVEPOINT a;
action-1;
RELEASE SAVEPOINT a; -- commit intermédiaire
SAVEPOINT b;
action-2;
ROLLBACK TO SAVEPOINT b; -- rollback intermédiaire
COMMIT;
--
Dimitri Fontaine
http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support
From | Date | Subject | |
---|---|---|---|
Next Message | F. BROUARD / SQLpro | 2012-01-05 13:24:02 | Re: Migration SQL Serveur 2008 vers PostgreSQL |
Previous Message | Guillaume Lelarge | 2012-01-05 10:05:55 | Re: Migration SQL Serveur 2008 vers PostgreSQL |