mercredi 22 mai 2013

Apercu des transactions autonomes (PRAGMA AUTONOMOUS_TRANSACTION).

On sait qu'une des règles fondamentales d'un SGBD est d'apporter une cohérence complète lors de transactions (atomicité de la transaction) ; cependant, il arrive que certaines transactions doivent être exécutées indépendamment de celle qui l'appelle. C'est ce qu'on nomme les transactions autonomes.

Oracle a mis en place un mécanisme permettant cette exception : la clause PRAGMA AUTONOMOUS_TRANSACTION. Cette clause se place à la déclaration de la procédure / fonction / trigger et précise ainsi que celle-ci sera autonome.

Ainsi, le commit et le rollback à l'intérieur de la transaction autonome n'auront aucun effet sur les procédures appelantes.
La meilleure façon de comprendre les transactions autonomes est de les voir en action (exemple détaillé). Pour ce faire,on va créer une table TEST et de la remplir avec deux rangées sans faire le commit;












SQL> insert into test values (1,' Ceci est un test numéro 1 ');
 1 row inserted

SQL> insert into test values (2,' Ceci est un test numéro 2 ');
 1 row inserted


SQL> select * from test;

        ID DESCRIPTION
---------- --------------------------------------------------
         1  Ceci est un test numéro 1
         2  Ceci est un test numéro 2
Maintenant, on va insérer des enregistrements dans cette table en utilisant la clause PRAGMA AUTONOMOUS_TRANSACTION avec un commit à la fin (bloc PLSQL avec la boucle FOR..IN).














SQL> select * from test;

        ID DESCRIPTION
---------- --------------------------------------------------
         1  Ceci est un test numéro 1
         2  Ceci est un test numéro 2
         3 Ceci est un test numéro 3
         4 Ceci est un test numéro 4
         5 Ceci est un test numéro 5
         6 Ceci est un test numéro 6
         7 Ceci est un test numéro 7
         8 Ceci est un test numéro 8
         9 Ceci est un test numéro 9
        10 Ceci est un test numéro 10
        11 Ceci est un test numéro 11
        12 Ceci est un test numéro 12
        13 Ceci est un test numéro 13
        14 Ceci est un test numéro 14
        15 Ceci est un test numéro 15

15 rows selected

On essaye maintenant de faire un ROLLBACK.
SQL> rollback;

Rollback complete

SQL> select * from test;

        ID DESCRIPTION
---------- --------------------------------------------------
         3 Ceci est un test numéro 3
         4 Ceci est un test numéro 4
         5 Ceci est un test numéro 5
         6 Ceci est un test numéro 6
         7 Ceci est un test numéro 7
         8 Ceci est un test numéro 8
         9 Ceci est un test numéro 9
        10 Ceci est un test numéro 10
        11 Ceci est un test numéro 11
        12 Ceci est un test numéro 12
        13 Ceci est un test numéro 13
        14 Ceci est un test numéro 14
        15 Ceci est un test numéro 15

13 rows selected

On constate que les deux lignes insérées dans la session en cours ont été annulées, tandis que les lignes insérées dans les transactions restent autonomes. La présence de la clause AUTONOMOUS_TRANSACTION a fait le bloc anonyme exécuter dans sa propre transaction, de sorte que la validation par un commit n'a aucun effet sur la session. Si on avait pas cette clause, on aurait dû voir toutes les rangées. 

On réinsère les deux lignes qui ont été annulées:
SQL> insert into test values (1,' Ceci est un test numéro 1 ');
1 row inserted

SQL> insert into test values (2,' Ceci est un test numéro 2 ');
1 row inserted

On va refaire un select sur la table, ça nous donne 15 rangées:
SQL> select * from test;

        ID DESCRIPTION
---------- --------------------------------------------------
         1  Ceci est un test numéro 1
         2  Ceci est un test numéro 2
         3 Ceci est un test numéro 3
         4 Ceci est un test numéro 4
         5 Ceci est un test numéro 5
         6 Ceci est un test numéro 6
         7 Ceci est un test numéro 7
         8 Ceci est un test numéro 8
         9 Ceci est un test numéro 9
        10 Ceci est un test numéro 10
        11 Ceci est un test numéro 11
        12 Ceci est un test numéro 12
        13 Ceci est un test numéro 13
        14 Ceci est un test numéro 14
        15 Ceci est un test numéro 15

15 rows selected
 
 On va mettre un commentaire sur la clause PRAGMA AUTONOMOUS_TRANSACTION:













Si on fait maintenant un select, ça nous donne 30 rangées.
30 rows selected

On fait un ROLLBACK:
SQL> rollback;
Rollback complete

SQL> select count(*) from test;

  COUNT(*)
----------
        30
Donc, contrairement à la spécification de la clause PRAGMA AUTONOMOUS_TRANSACTION, les données ont été validées. C'est ça le mécanisme de cette clause.

Aucun commentaire:

Enregistrer un commentaire