Bonjour,
Je suis confronté au problème suivant :
Prenons une appli web permettant de passer des commandes sur un produit :
Imaginons qu'on ait une méthode commanderProduit au sein d'une classe de service :
en pseudo-code cela donnerait l'algorithme suivant :
début commanderProduit
récupération du produit
si le produit a un stock > 0 {
on décrémente le stock du produit de 1 en BDD
on enregistre la commande en BDD
}
fin commanderProduit
Le problème est le suivant : nous avons 2 clients qui commande le produit en même temps et le stock est égal à 1.
2 threads accéderaient donc à cette méthode en même temps, ces 2 threads pourraient passer dans la condition stock > 0, au final le stock serait décrémenté 2 fois, ce qui est incorrect au niveau logique métier.
Rendre la méthode thread safe n'est pas une solution valable, cela ralentirait le temps de traitement dans le cas d'un grand nombre de connexions simultanées.
Une solution possible serait d'ajouter une contrainte sur le stock au niveau de la BDD, cela ferait échouer la transaction correspondant à la méthode passerCommande.
Quelle solution envisageriez-vous pour traiter ce cas de figure ? Comment gère-t-il cela sur les gros sites marchands ?
Partager