MongoDB – operaciones atómicas

Datos del modelo para operaciones atómicas

El enfoque recomendado para mantener la atomicidad sería almacenar toda la información relacionada, que se actualiza con frecuencia en un solo documento utilizando documentos incrustados… Esto asegurará que todas las actualizaciones sean atómicas para un documento.

Supongamos que hemos creado una colección denominada productDetails y hemos insertado 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 información sobre el cliente que compra el producto en producto_comprado_por campo. Ahora, cuando un nuevo cliente compra un producto, primero verificamos si está disponible usando producto_disponible campo. Si está disponible, disminuiremos el valor del campo product_available y también insertaremos el documento incrustado del nuevo cliente en el campo product_bought_by. Usaremos findAndModify para esta función, 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 que utiliza un documento en línea y una consulta findAndModify garantiza que la información de compra del producto solo se actualice si el producto está disponible. Y toda esta transacción, que está en una solicitud, es atómica.

Por el contrario, considere un escenario en el que podríamos mantener la disponibilidad del producto y quién lo compró por separado. En este caso, primero verificaremos si el artículo está disponible con la primera solicitud. Luego, en la segunda solicitud, actualizaremos la información de compra. Sin embargo, es posible que entre estas dos solicitudes, algún otro usuario haya comprado el producto y ya no esté disponible. Sin saberlo, 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 incompatible porque vendimos un producto que está agotado.

🚫