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

Operaciones atómicas en MongoDB

Modelo de datos de operaciones atómicas

El método de mantenimiento de la atomicidad es mantener toda la información relevante, que a menudo se actualiza juntos en un solo documento mediante documentos incrustados. Esto asegura que todas las actualizaciones del documento único sean atómicas.

Supongamos que ya hemos creado una colección llamada productDetails e insertado un documento en la misma, 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-Ene-2014"
			},
			{
				"customer": "mark",
				"date": "8-Ene-2014"
			}
		]
	}
)
WriteResult({ "nInserted" : 1 })
>

En este documento, vamos a incrustar la información de los clientes que compraron productos en el campo product_bought_by. Ahora, cada vez que un nuevo cliente compre un producto, primero verificaremos si el producto sigue siendo disponible utilizando el campo product_available. Si está disponible, reduciríamos el valor del campo product_available e insertaríamos el documento incrustado del nuevo cliente en el campo product_bought_by. Usaremos el comando findAndModify para esta función, ya que el proceso de búsqueda y actualización de documentos es el mismo.

>db.products.findAndModify({ 
   query:{_id:2,product_available:{$gt:0}}, 
   update:{ 
      $inc:{product_available:-1}, 
      $push:{product_bought_by:{customer:"rob",date:"9-Ene-2014"}} 
   }    
})

Adoptamos el método de嵌入 documentos y la consulta findAndModify para asegurar que la información de compra del producto se actualice solo cuando el producto esté disponible. Todo el proceso de transacción ocurre en la misma consulta y es atómico.

Por el contrario, considere la siguiente situación: podemos mantener separadamente la disponibilidad del producto y la información sobre quién compró el producto. En este caso, primero verificaremos si el producto está disponible utilizando la primera consulta. Luego, en la segunda consulta, actualizaremos la información de compra. Sin embargo, es posible que otros usuarios hayan comprado el producto entre la ejecución de estas dos consultas, y el producto ya no esté disponible. Sin saber esto, nuestra segunda consulta actualizará la información de compra basándose en el resultado de la primera consulta. Esto llevará a una incoherencia en la base de datos, ya que ya hemos vendido un producto no disponible.