Je sais que la question peut sembler bête... mais j'ai beau rechercher dans plusieurs tutoriels, je n'arrive pas à être sûr du comportement d'Oracle.
Voici un petit bout de code pour appuyer la question.
(Note: Le code est volontairement très simplifié pour souligner l'essentiel. Dans ce cas par exemple, c'est clair qu'on pourrait directement faire l'incrémentation lors de l'update.)
Dans ce cas-ci, est-ce que la partie comprise entre le begin et le end correspond bien à une transaction "isolée"?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CREATE OR REPLACE FUNCTION TRANSACTION_OR_NOT (param1 IN VARCHAR2) RETURN NUMBER IS idLast NUMBER(12); idNew NUMBER(12); BEGIN SELECT ID_LAST into idLast FROM ID_TEST; idNew := idLast + 1; UPDATE ID_TEST SET ID_LAST = idNew; RETURN idNew; END;
De ce que j'ai compris, avec Oracle, la transaction est automatiquement initialisée... et j'ai l'impression que le "commmit" se fait automatiquement à la fin de la procédure si il n'y a pas eu de rollback (mais je n'en suis pas certain).
Si plusieurs composants font appel à cette procédure en même temps, cela peut-il engendrer des problèmes? A mon sens, si une procédure/fonction est bien une transaction par défaut serializable, il est impossible qu'un second appel à cette procédure fasse le "select" alors qu'un premier appel à cette procédure a fait le "+1", mais n'a pas encore eu le temps de faire le "update". Est-ce que je me trompe?
J'imagine que je pourrais rajouter un "set transaction isolation level serializable;" après le BEGIN, ainsi qu'un "COMMIT;"' avant le RETURN, mais j'ai l'impression que ça ne changerait rien au comportement...
D'autant plus que sur le tutoriel que l'on trouve sur developpez.com, il est bien écrit en gras rouge "D'une façon générale, les procédures ne devraient pas exécuter d'instruction de fin de transaction (COMMIT, ROLLBACK, Ordre DDL). La décision d'enregistrer ou annuler la transaction en cours relève du programme appelant "... (D'ailleurs, lorsqu'il n'y a pas vraiment de programme appelant faisant explicitement un "commit, je me demande qui s'en charge... mais c'est une autre histoire.)
Merci à ceux qui pourront me répondre... même si c'est une question de débutant, ça me semble important de connaitre ce fonctionnement avant de pouvoir utiliser efficacement les procédures en PLSQL.
Partager