Bonjour à tous,

J'ai mis en place un système de log d'exécution des procédures stockées.
Cela me permet d'avoir la pile d'exécution (application -> service web > proc stock), les temps d'exécution, ...

Pour ce faire j'ai créé 3 procédures stockées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
CREATE PROCEDURE `pcdTrace1`(IN `_Texte` TINYTEXT, IN `_Appelant` TINYTEXT)
BEGIN
INSERT INTO Traces(Libellé,Appelant) VALUES (_Texte,_Appelant);
END
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
CREATE PROCEDURE `pcdTraceAppelNiv1_Début`(IN `_NomFonction` TINYTEXT, IN `_CtxAppelNiv1` TINYTEXT, OUT `_IDTracesAppel` INT(10) UNSIGNED)
BEGIN
INSERT INTO
	TracesAppel(NomFonction,CtxAppelNiv1,AppelantNiv1,Début,NoCnx)
VALUES
	(_NomFonction,_CtxAppelNiv1,USER(),sysdate(6),CONNECTION_ID())
;
SELECT LAST_INSERT_ID() INTO _IDTracesAppel;
END
Remarquez le OUT `_IDTracesAppel qui est récupéré par les appelantes via @IDTracesAppel

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 PROCEDURE `pcdTraceAppel_Fin1`(IN `_IDTracesAppel` INT(10) UNSIGNED, IN `_Appelant` TINYTEXT)
BEGIN
DECLARE Maintenant DATETIME(6);
UPDATE
	TracesAppel
SET
	Fin=Maintenant,
	Durée=TIMEDIFF(Maintenant,Début)
WHERE
	IDTracesAppel=_IDTracesAppel
;
IF ROW_COUNT()=0 THEN
	CALL pcdTrace1(CONCAT_WS('','Erreur - TracesAppel.IDTracesAppel=',_IDTracesAppel,' est trouvable'),CONCAT_WS('->',_Appelant,'pcdTraceAppel_Fin1'));
END IF;
 
END
Une procédure de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
CREATE PROCEDURE `pcdTraceAppel_TestAppelNiv1`()
BEGIN
CALL pcdTraceAppelNiv1_Début('pcdTest','test',@IDTracesAppel);
SELECT BENCHMARK(1000000,ENCODE("bonjour","au revoir"));
CALL pcdTraceAppel_Fin(@IDTracesAppel);
END
Mon problème c'est que lors du lancement de pcdTraceAppel_TestAppelNiv1() j'ai de temps en temps des erreurs m'indiquant que IDTracesAppel n'a pas été trouvé (tracé car ROW_COUNT()=0)
Or, si je consulte la table TracesApppel, je vois le IDTracesAppel en question !
Cet enregistrement contient des valeurs pour tous les champs (NomFonction, AppelantNiv1,Début) mais reste NULL pour Fin et Durée

Et ces erreurs sont encore plus régulières voire quasi systématique si j'exécute directement depuis l'éditeur de requête (HeidiSQL) or proc stock pcdTraceAppel_TestAppelNiv1()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
CALL pcdTraceAppelNiv1_Début('test','test',@IDTracesAppel);
SELECT @IDTracesAppel;
SELECT BENCHMARK(1000000,ENCODE("bonjour","au revoir"));
CALL pcdTraceAppel_Fin1(@IDTracesAppel,'test');
J'ajoute que ces procédures sont très fortement sollicitées (plusieurs milliers d'appels par minute)

Voilà si l'un d'entre vous a un début de commencement d'idée...
Merci d'avance.