PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Transaction autonome dans PostgreSQL 9.1

Je travaille actuellement sur les migrations d'Oracle vers PostgreSQL. Bien que je sois DBA, ces jours-ci, j'apprends un peu aussi sur la piste des développeurs… 🙂
Voyons une petite fonctionnalité d'Oracle et une manière similaire dans PostgreSQL.

Transaction autonome, qu'est-ce que c'est ?

Une transaction autonome est une transaction indépendante initiée par une autre transaction et exécutée sans interférer avec la transaction parente. Lorsqu'une transaction autonome est appelée, la transaction d'origine est suspendue. Le contrôle est rendu lorsque la transaction autonome effectue un COMMIT ou un ROLLBACK.

Exemple dans Oracle :

Créez deux tables et une procédure comme indiqué ci-dessous.

créez la table table_a(nom varchar2(50));
créez la table table_b(nom varchar2(50));

créer ou remplacer la procédure insert_into_table_a is
commence
insert into table_a values('Am in A');
commit;
end;

Testons-le ici.

SQL> begin
2 insert into table_b values('Am in B');
3 insert_into_table_a;
4 rollback;
5 fin ;
6 /

Procédure PL/SQL terminée avec succès.

SQL> sélectionnez * dans table_a ;

Suis en A

SQL> select * from table_b;

Suis en B

Dans mon exemple ci-dessus, la ligne 3 a validé la ligne 2, où elle doit être annulée conformément à la ligne 4. Dans mon exemple, je recherche un bloc de transaction pour qu'il se comporte indépendamment, pour y parvenir dans Oracle, nous devons inclure PRAGMA_transaction_autonome dans la procédure déclaration pour se comporter comme un bloc de transaction indépendant. Reprenons :

Tronquer la table table_a ;
Tronquer la table table_b ;

créer ou remplacer la procédure insert_into_table_a is pragma ');
commit;
end;

SQL> begin
2 insert into table_b values('Am in B');
3 INSERT_INTO_TABLE_A;
4 rollback;
5 end;
6 /

Procédure PL/SQL terminée avec succès.

SQL> select * from table_a;

NOM
----------
Suis dans A

SQL> sélectionnez * dans table_b ;

aucune ligne sélectionnée

Comment faire fonctionner PostgreSQL ?

Autonomous Transaction, sont très bien maîtrisés dans Oracle. Une fonctionnalité similaire n'existe pas dans PostgreSQL, mais vous pouvez y parvenir avec un hack en utilisant dblink. Ci-dessous le lien, où le hack a été fourni :
http://archives.postgresql.org/pgsql-hackers/2008-01/msg00893.php

create extension dblink;

créer ou remplacer la fonction insert_into_table_a() renvoie void as $$
begin
perform dblink_connect('pragma','dbname=edb');
exécuter dblink_exec('pragma','insert into table_a values ​​(''Am in A'');');
exécuter dblink_exec('pragma','commit;');
perform dblink_disconnect('pragma');
end;
$$ language plpgsql;

edb=# begin;
BEGIN
edb=# insert into table_b VALUES ('am in B');
INSERT 0 1
edb=# select insert_into_table_a();
insert_into_table_a
------------ ---------

(1 ligne)

edb=# select * from table_a;
name
---- -----
Je suis dans A
(1 ligne)

edb=# select * from table_b;
name
----- ----
am in B
(1 row)

edb=# rollback;
ROLLBACK
edb=# select * from table_a;
nom
---------
Je suis dans A
(1 ligne)

edb=# select * from table_b;
nom
------
(0 lignes)

N'est-ce pas simple, grâce au fournisseur de hack.