Je crée une API qui interagit avec une base de données d'inventaire MySQL. Nous avons 15 utilisateurs qui peuvent réserver des produits, mettant à jour la base de données de la manière suivante :
- Diminution de la valeur
on-hand
et augmentation de la valeurréservée
d'un produit.
La table inventaire
ressemble à ceci :
id int
sku varchar
on-hand int
reserved int
Le problème est : Comment gérer la mise à jour de la ligne si 2 utilisateurs essaient de la mettre à jour en même temps ?
La première approche à laquelle je pensais était d'utiliser Transactions:
beginTransaction();
// SELECT on-hand, reserved from inventory
// Mettre à jour les valeurs de l'inventaire
$db->commit();
return response()->json([ 'success' => 1, 'data' => $data ])
}
La deuxième consistait à utiliser le verrouillage pessimiste:
sharedLock()
// Mettre à jour les valeurs de l'inventaire
return response()->json([ 'success' => 1, 'data' => $data ])
}
La troisième était de créer un champ updating
avec une valeur de zéro. Lors de la sélection des produits à mettre à jour, je vérifierais le champ updating
avant de faire quoi que ce soit avec ces lignes. Le problème que je vois ici est que je devrais boucler sur celles avec updating != 0
jusqu'à ce qu'elles deviennent disponibles. Plus de sélections et de mises à jour viennent de cette approche.
Quelle est la meilleure option à prendre? Il peut y avoir plus d'options que celles que j'ai écrites ici.