MongoDB - Operaciones atómicas

Datos del modelo para operaciones atómicas

El enfoque recomendado para mantener la atomicidad sería mantener toda la información relacionada, que con frecuencia se actualiza junta en un solo documento utilizando embedded documents. Esto aseguraría que todas las actualizaciones de un solo documento sean atómicas.

Supongamos que hemos creado una colección con el nombre productDetails e insertamos documentos en ella como se muestra a continuación:

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

En este documento, hemos incorporado la información del cliente que compra el producto en el product_bought_bycampo. Ahora, cada vez que un nuevo cliente compra el producto, primero verificaremos si el producto todavía está disponible usandoproduct_availablecampo. Si está disponible, reduciremos el valor del campo product_available e insertaremos el documento incrustado del nuevo cliente en el campo product_bought_by. UsaremosfindAndModify comando para esta funcionalidad porque busca y actualiza el documento al mismo tiempo.

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

Nuestro enfoque de documento incrustado y el uso de la consulta findAndModify asegura que la información de compra del producto se actualice solo si el producto está disponible. Y toda esta transacción, al estar en la misma consulta, es atómica.

En contraste con esto, considere el escenario en el que podemos haber mantenido la disponibilidad del producto y la información sobre quién compró el producto, por separado. En este caso, primero verificaremos si el producto está disponible mediante la primera consulta. Luego en la segunda consulta actualizaremos la información de compra. Sin embargo, es posible que entre las ejecuciones de estas dos consultas, algún otro usuario haya comprado el producto y ya no esté disponible. Sin saber esto, nuestra segunda consulta actualizará la información de compra en función del resultado de nuestra primera consulta. Esto hará que la base de datos sea inconsistente porque hemos vendido un producto que no está disponible.