MongoDB - Operazioni atomiche

Dati modello per operazioni atomiche

L'approccio consigliato per mantenere l'atomicità sarebbe quello di mantenere tutte le informazioni correlate, che vengono frequentemente aggiornate insieme in un unico documento utilizzando embedded documents. Ciò assicurerebbe che tutti gli aggiornamenti per un singolo documento siano atomici.

Supponiamo di aver creato una raccolta con il nome productDetails e di aver inserito un documento al suo interno come mostrato di seguito -

>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 abbiamo incorporato le informazioni del cliente che acquista il prodotto nel file product_bought_bycampo. Ora, ogni volta che un nuovo cliente acquista il prodotto, controlleremo prima se il prodotto è ancora disponibile utilizzandoproduct_availablecampo. Se disponibile, ridurremo il valore del campo product_available e inseriremo il documento incorporato del nuovo cliente nel campo product_bought_by. Noi useremofindAndModify comando per questa funzionalità perché cerca e aggiorna il documento nello stesso passaggio.

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

Il nostro approccio al documento incorporato e all'utilizzo della query findAndModify garantisce che le informazioni sull'acquisto del prodotto vengano aggiornate solo se il prodotto è disponibile. E l'intera transazione essendo nella stessa query, è atomica.

Al contrario, considera lo scenario in cui potremmo aver mantenuto la disponibilità del prodotto e le informazioni su chi ha acquistato il prodotto, separatamente. In questo caso, verificheremo prima se il prodotto è disponibile utilizzando la prima query. Quindi nella seconda query aggiorneremo le informazioni di acquisto. Tuttavia, è possibile che tra le esecuzioni di queste due query, qualche altro utente abbia acquistato il prodotto e non sia più disponibile. Senza saperlo, la nostra seconda query aggiornerà le informazioni di acquisto in base al risultato della nostra prima query. Ciò renderà il database incoerente perché abbiamo venduto un prodotto che non è disponibile.