阅读 151

MongoDB 原子操作

原子操作的模型数据

维护原子性的推荐方法是保留所有相关信息,这些信息经常使用嵌入的文档一起更新到一个文档中。这将确保单个文档的所有更新都是原子的。

假设我们已经创建了一个名称为productDetails的集合,并在其中插入了一个文档,如下所示-

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

在本文档中,我们将购买产品的客户的信息嵌入到 product_bought_by 字段中。现在,每当新客户购买产品时,我们将首先使用 product_available 字段检查产品是否仍然可用。如果可用,我们将减少product_available字段的值,并在product_bought_by字段中插入新客户的嵌入文档。我们将为此功能使用 findAndModify 命令,因为它搜索和更新文档的过程是相同的。

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

我们采用嵌入文档和使用 findAndModify 查询的方法,确保只有在产品可用时才更新产品购买信息。整个事务都在同一个查询中,是原子的。

与此相反,请考虑以下情况:我们可能分别保留了产品的可用性和有关谁购买了该产品的信息。在这种情况下,我们将使用第一个查询首先检查产品是否可用。然后在第二个查询中,我们将更新购买信息。但是,有可能在执行这两个查询之间,其他用户已经购买了该产品,而该产品不再可用。在不知道这一点的情况下,我们的第二个查询将基于我们第一个查询的结果来更新购买信息。这将使数据库不一致,因为我们已经出售了不可用的产品。


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐