MongoDB - Opérations atomiques

Données de modèle pour les opérations atomiques

L'approche recommandée pour maintenir l'atomicité serait de conserver toutes les informations connexes, qui sont fréquemment mises à jour ensemble dans un seul document en utilisant embedded documents. Cela garantirait que toutes les mises à jour d'un seul document sont atomiques.

Supposons que nous ayons créé une collection avec le nom productDetails et y avons inséré des documents comme indiqué ci-dessous -

>db.createCollection("products")
{ "ok" : 1 }
> db.productDetails.insert(
	{
		"_id":1,
		"product_name": "Samsung S3",
		"category": "mobiles",
		"product_total": 5,
		"product_available": 3,
		"product_bought_by": [
			{
				"customer": "john",
				"date": "7-Jan-2014"
			},
			{
				"customer": "mark",
				"date": "8-Jan-2014"
			}
		]
	}
)
WriteResult({ "nInserted" : 1 })
>

Dans ce document, nous avons intégré les informations du client qui achète le produit dans le product_bought_bychamp. Désormais, chaque fois qu'un nouveau client achète le produit, nous vérifierons d'abord si le produit est toujours disponible en utilisantproduct_availablechamp. Si disponible, nous réduirons la valeur du champ product_available et insérerons le document intégré du nouveau client dans le champ product_bought_by. Nous utiliseronsfindAndModify commande pour cette fonctionnalité car elle recherche et met à jour le document de la même manière.

>db.products.findAndModify({ 
   query:{_id:2,product_available:{$gt:0}}, 
   update:{ 
      $inc:{product_available:-1}, 
      $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} 
   }    
})

Notre approche du document intégré et de l'utilisation de la requête findAndModify garantit que les informations d'achat du produit ne sont mises à jour que si le produit est disponible. Et l'ensemble de cette transaction étant dans la même requête, est atomique.

En revanche, considérons le scénario dans lequel nous avons pu conserver séparément la disponibilité du produit et les informations sur qui a acheté le produit. Dans ce cas, nous vérifierons d'abord si le produit est disponible à l'aide de la première requête. Ensuite, dans la deuxième requête, nous mettrons à jour les informations d'achat. Cependant, il est possible qu'entre les exécutions de ces deux requêtes, un autre utilisateur ait acheté le produit et qu'il ne soit plus disponible. Sans le savoir, notre deuxième requête mettra à jour les informations d'achat en fonction du résultat de notre première requête. Cela rendra la base de données incohérente car nous avons vendu un produit qui n'est pas disponible.