Bonjour,
Notre applicatif dispose d'un package permettant de gérer les différentes numérotations de nos objets métiers (tiers, contrat, etc...). Ce package s'appuie sur une table NUMEROTATION, dont une fonction permet de récupérer une nouvelle numérotation en incrémentant une colonne (VAL_COURANTE). Le commit de la transaction se fait lorsque le tiers, ou le contrat est enregistré.
Lors d'un appel unique cela fonctionne très bien. Cependant lors de 2 appels simultanés et commit sur chaque session à la suite de ces 2 appels, le numéro retourné est le même, et la colonne VAL_COURANTE a été incrémenté qu'une fois.
La première résolution a été d'ajouter un PRAGMA AUTONOMOUS_TRANSACTION;afin de commiter la modification de la table NUMEROTATION, lors de l'appel à la fonction de récupération d'un nouveau numéro, sans pour autant commiter l'intégralité de la création de l'objet métier.
Encore une fois dans le cadre de test solo, cela a résolu le problème principal, mais il reste un point de détail, qui est le sujet de ce topic. En effet, il peut arriver, certes, très rarement, que la procédure puisse être appeler simultanément, et que des insert ou update se fasse avant le commit sur chaque session.
Est-il possible lors de l'appel sur 2 sessions différentes, de mettre en attente l'appel de la fonction, tel que le ferait un mutex dans d'autre langage de programmation?
En gros, voila ce que j'aimerai, en remplaçant les TODO :
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
18
19
20
21
22
23
24
25
26
27
28
29
30 CREATE OR REPLACE PACKAGE BODY GESTION_NUMEROTATION AS FUNCTION SUIVANT(pTYPE_NUM NUMEROTATION.TYPE_NUM%TYPE, pNUM_SOC NUMEROTATION.NUM_SOC%TYPE, pID_CI NUMEROTATION.ID_CI%TYPE := NULL, pCD_PR NUMEROTATION.CD_PR%TYPE := NULL, pCD_TT NUMEROTATION.CD_TT%TYPE := NULL, pID_INT NUMEROTATION.ID_INT%TYPE := NULL, pANNEE_NUM NUMEROTATION.ANNEE_NUM%TYPE := NULL, pMOIS_NUM NUMEROTATION.MOIS_NUM%TYPE := NULL) RETURN VARCHAR2 IS PRAGMA AUTONOMOUS_TRANSACTION; -- Var de ma fonctions BEGIN -- TODO : Mutex début -- Code de la fonction commit; -- TODO : Mutex fin EXCEPTION WHEN OTHERS THEN rollback; -- TODO : Mutex fin END SUIVANT; END GESTION_NUMEROTATION;
Partager