Bonjour bonjour,
Un petit retour sur les modifications apportées et... ce n'est pas très concluant... 
Le problème semble finalement plus complexe et l'ajout d'une transaction et la factorisation du code ne le résout pas.... Un peu plus d'explications seront utiles je pense.
L'adresse IP spécifiée dans la configuration
resources.multidb.xxx.host = "aaa.bbb.ccc.030"
est en fait une IP virtuelle. Lorsqu'une tentative de connexion est faite sur cette dernière, le Load Balancer va, en fonction de la charge machines, basculer le flux effectif sur une des adresses réelles qui lui sont liées, soit aaa.bbb.ccc.031 ou bien aaa.bbb.ccc.032.
Visiblement, il se passerait alors ceci :
Lorsqu'un appel de fonction du Web Service est effectué, je log immédiatement ce dernier via le dbtable DbTable_LogsRequest (l'objet étant construit conformément au code montré plus haut). Les paramètres sont ensuite logués dans la foulée via DbTable_LogsRequestParameters. Le tout s'effectue successivement au sein d'une même fonction : la requête suivi de ces paramètres avec une référence sur celle-ci.
Sont ensuite traitées différentes données en vue de construire un résultat. Je log alors ce dernier via DbTable_LogsRequestResults, le travail étant effectué par une autre fonction. Est à nouveau utilisé pour ce log l'identifiant de requête retourné lors de la première insertion (la requete) afin de satisfaire les dépendances de clef étrangère (cf le MCD).
Voici pour le contexte.
Le problème serait alors le suivant. Supposons que le Load Balancer ait ouvert une connexion effective sur l'IP aaa.bbb.ccc.031 lors de la première insertion (LogsRequest). Je récupère alors un identifiant de requête qui est présent sur ce serveur. Un tas de traitement est effectué et arrive le moment du log des résultats (ou paramètres, le cas s'est nouvellement présenté). Si le Load Balancer rend la main à aaa.bbb.ccc.031, alors pas de soucis. En renvanche, si la main est donnée à aaa.bbb.ccc.032 et que la synchro des 2 masters (031 et 032) n'a pas encore eu le temps de s'effectuer, alors on va tenter de référer vers une requête qui n'existe pas encore, puisqu'en effet elle a été insérée sur l'autre serveur. D'où la belle erreur MySql de violation de clef étrangère.
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`LogsRequestResults`, CONSTRAINT `fk_logsrequestresults_logsrequest` FOREIGN KEY (`ref_id_logs_request`) REFERENCES `LogsRequest` (`id_logs_request`) ON DELETE CASCADE ON UPDATE CASCADE)
Alors pourquoi ouvre-t-il une seconde connexion et ne réutilise-t-il pas celle ouverte pour l'insertion dans LogsRequest, mystère. Est-ce parce que Zend ne verrait que l'IP virtuelle 030 et que lors d'une nouvelle insertion toute la démarche d'ouverture de connexion est à nouveau réalisée (ce qui serait bien étrange) ce qui entraînerait donc inévitablement l'intervention du Load Balancer (et donc potentiellement un nouvelle IP) ? Comment l'empêcher alors d'ouvrir une autre connexion ? N'y a-t-il aucun moyen de le forcer à utiliser la même IP effective que celle utilisée lors de la toute première insertion (et donc la même connexion) ?
Je peux mettre le code relatif aux traitements des logs si ça peut aider...
J'avoue pour le coup être un peu perdu et ne plus savoir vers quelle solution m'orienter...
Merci d'avance pour toutes les suggestions que vous pourriez faire..
Partager