English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB-Atomare Operationen

Modelldaten für atomare Operationen

Die Wartung der Atomausführung erfolgt durch das Behalten aller相关信息, die oft gemeinsam mit eingebetteten Dokumenten in ein Dokument aktualisiert werden. Dies stellt sicher, dass alle Updates des einzelnen Dokuments atomar sind.

Angenommen, wir haben eine Sammlung namens productDetails erstellt und einen Dokument wie folgt hinzugefü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 diesem Dokument fügen wir die Informationen der Kunden, die Produkte gekauft haben, in das Feld product_bought_by ein. Jedes Mal, wenn ein neuer Kunde ein Produkt kauft, überprüfen wir zunächst mit dem Feld product_available, ob das Produkt noch verfügbar ist. Wenn es verfügbar ist, verringern wir den Wert des Feldes product_available und fügen in das Feld product_bought_by das Dokument des neuen Kunden hinzu. Für diese Funktion verwenden wir den Befehl findAndModify, da der Such- und Update-Prozess desselben Dokuments ist.

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

Wir verwenden den Ansatz der Einfügung von Dokumenten und der findAndModify-Abfrage, um sicherzustellen, dass die Kaufinformationen des Produkts nur aktualisiert werden, wenn das Produkt verfügbar ist. Der gesamte Vorgang ist in einer einzigen Abfrage atomar.

Im Gegensatz dazu sollten Sie folgende Situation in Betracht ziehen: Wir könnten möglicherweise die Verfügbarkeit des Produkts und Informationen darüber, wer das Produkt gekauft hat, getrennt aufbewahren. In diesem Fall würden wir zunächst mit der ersten Abfrage überprüfen, ob das Produkt verfügbar ist. Anschließend aktualisieren wir in der zweiten Abfrage die Kaufinformationen. Es ist jedoch möglich, dass zwischen der Ausführung dieser beiden Abfragen andere Benutzer das Produkt gekauft haben und es nicht mehr verfügbar ist. Ohne diese Information wird unsere zweite Abfrage auf dem Ergebnis unserer ersten Abfrage basieren, um die Kaufinformationen zu aktualisieren. Dies würde eine Inconsistenz in der Datenbank verursachen, da wir ein nicht verfügbares Produkt verkauft haben.