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

Operazioni atomiche MongoDB

Modello dati operazione atomica

Il metodo di mantenimento dell'atomicità delle raccomandazioni è conservare tutte le informazioni pertinenti, che spesso vengono aggiornate insieme in un documento tramite documenti embedded. Questo garantisce che tutte le aggiornamenti del singolo documento siano atomici.

Supponiamo di aver già creato una raccolta chiamata productDetails e di aver inserito un documento come segue-

>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 questo documento, immetteremo le informazioni sui clienti che hanno acquistato prodotti nel campo product_bought_by. Ogni volta che un nuovo cliente acquista un prodotto, controlleremo prima se il prodotto è ancora disponibile utilizzando il campo product_available. Se disponibile, ridurremo il valore del campo product_available e inseriremo il documento embedded del nuovo cliente nel campo product_bought_by. Utilizzeremo il comando findAndModify per questa funzione, poiché il processo di ricerca e aggiornamento del documento è lo stesso.

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

Adottiamo il metodo di documentazione incorporata e la query findAndModify per assicurarci che le informazioni sull'acquisto del prodotto vengano aggiornate solo quando il prodotto è disponibile. L'intera transazione è atomica e avviene nella stessa query.

Al contrario, considerate la seguente situazione: potremmo riservare separatamente la disponibilità del prodotto e le informazioni su chi ha acquistato il prodotto. In questo caso, utilizzeremo la prima query per verificare prima la disponibilità del prodotto. Poi, nella seconda query, aggiorneremo le informazioni sull'acquisto. Tuttavia, è possibile che altri utenti abbiano acquistato il prodotto e che non sia più disponibile tra l'esecuzione di queste due query. Senza sapere questo, la nostra seconda query aggiornerebbe le informazioni sull'acquisto basandosi sul risultato della prima query. Questo renderebbe il database incoerente, poiché abbiamo venduto un prodotto non disponibile.