MongoDB - Atomoperationen

Modelldaten für atomare Operationen

Der empfohlene Ansatz zur Aufrechterhaltung der Atomizität besteht darin, alle zugehörigen Informationen zu speichern, die häufig zusammen in einem einzigen Dokument aktualisiert werden embedded documents. Dies würde sicherstellen, dass alle Aktualisierungen für ein einzelnes Dokument atomar sind.

Angenommen, wir haben eine Sammlung mit dem Namen productDetails erstellt und Dokumente wie unten gezeigt eingefügt.

>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 })
>

In dieses Dokument haben wir die Informationen des Kunden, der das Produkt kauft, in das Dokument eingebettet product_bought_byFeld. Wenn ein neuer Kunde das Produkt kauft, prüfen wir zunächst, ob das Produkt noch verfügbar istproduct_availableFeld. Falls verfügbar, reduzieren wir den Wert des Felds product_available und fügen das eingebettete Dokument des neuen Kunden in das Feld product_bought_by ein. Wir werden verwendenfindAndModify Befehl für diese Funktionalität, da das Dokument gleichzeitig durchsucht und aktualisiert wird.

>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"}} 
   }    
})

Unser Ansatz des eingebetteten Dokuments und der Verwendung der findAndModify-Abfrage stellt sicher, dass die Produktkaufinformationen nur aktualisiert werden, wenn das Produkt verfügbar ist. Und die gesamte Transaktion, die sich in derselben Abfrage befindet, ist atomar.

Betrachten Sie im Gegensatz dazu das Szenario, in dem wir möglicherweise die Produktverfügbarkeit und die Informationen darüber, wer das Produkt gekauft hat, separat aufbewahrt haben. In diesem Fall prüfen wir zunächst anhand der ersten Abfrage, ob das Produkt verfügbar ist. In der zweiten Abfrage aktualisieren wir dann die Kaufinformationen. Es ist jedoch möglich, dass zwischen den Ausführungen dieser beiden Abfragen ein anderer Benutzer das Produkt gekauft hat und es nicht mehr verfügbar ist. Ohne dies zu wissen, aktualisiert unsere zweite Abfrage die Kaufinformationen basierend auf dem Ergebnis unserer ersten Abfrage. Dadurch wird die Datenbank inkonsistent, da wir ein Produkt verkauft haben, das nicht verfügbar ist.