Bonjour
dans une application Web, avec des End point WS, je rencontre un problème d'accès/modification en concurrence des données.
data, pour faire simple:
- Panier a des attributs (simple: string et number) et une liste d'objet Articles
endPoint ws:
- WS1 : /updatePanier : ce ws passe une liste des id de panier à modifier
-coté service: on parcours la liste des ids
- charger le panier ia son id
- faire les modif demandées sur l'objet panier
- parcourir la liste des articles et faire les modifis nécessaires article par article
- renvoyer le résultat au client
-WS2: movePanier: permet de déplacer l'ensemble des articles du panier 1 vers panier 2 (appel avec un flux xml, donc je px avoir liste des movePanier)
-coté service: on parcourt la liste du flux en entrée.
-pour chaque opération de movePanier,
- je charge le panier origine, si panier destination n'existe pas je le crée
- je duplique les articles et je les associe avec panier de destination
- j'annule les articles du panier origine ==> modification article
- je ferme le panier origine ==> modification de l'objet panier
problème 1:
mon problème des fois, je reçois plusieurs appels WS1 sur les mêmes paniers et à quelques nanosecondes:et comme les objets sont gérés par hibernate @version, souvent la deuxième modification tombe en erreurs.
problème 2:
je reçois des appels WS1 et WS2 au même temps et comme dans Problème 1 les deux appels se mélangent
Solution a court terme:
WS2: j'ai un seul client qui est autorisé à faire le movePaner, nous lui avons demandé de ne pas lancer plusieurs appels en même temps.
WS1 et WS2 de travailler a des créneaux horaire différents.
Solution envisagée
gérer une file d'attente, quand WS1 prend un panier il le lock, et si le WS2 a besoin de modifier le même panier il doit attend.
auriez vous une solution à mon problème ?
je suis preneur de toutes idée & piste de réflexion (bonnes et mauvaises sachant qu'il n'y a pas de mauvaise idée dans notre domaine)
cordialement
Partager