• mongodb 原子操作findAndModify


    原子操作模型数据findAndModify

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

    考虑下面的 products 文档:

    {
       "_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"
          }
       ]
    }

    在本文档中,我们已经嵌入客户买该产品的信息在 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"}} 
       }    
    })
    以上的意思是,当id为2的商品,available的值大于0时,将执行更新:available - 1 ,并且将
    product_bought_by:{customer:"rob",date:"9-Jan-2014"}}将入到文档中

    嵌入式文档并使用 findAndModify 查询的方法可以确保只有当它是提供产品的购买信息时被更新。 而整个此事务在同一个查询中的,所以是一个原子的。

    与此相反,考虑我们可能已经保存了产品的可用性和已经购买的产品,独立的信息情形。在这种情况下,我们会先检查该产品先查询是否可用。第二个查询,我们将更新采购信息。然而,这是可能的,这两个查询的执行之间,其他一些用户已经购买的产品,它没有更多可用。如果不知道这一点,我们的第二个查询将更新基于第一个查询结果的购买信息。这将使数据库不一致,因为我们销售的产品是不具备(产品可能没有了)的。

  • 相关阅读:
    对象引用与对象克隆
    谁被回收了
    SpringMVC 返回json
    html基础
    org.hibernate.HibernateException: No Session found for current thread
    VB6之SendMessage模拟拖放事件
    VB6之GIF分解
    VB6之反编译工具VBRezQ
    VB6之WebBrowser控件
    (转载)VB6之鼠标移出事件
  • 原文地址:https://www.cnblogs.com/wangjing666/p/6844204.html
Copyright © 2020-2023  润新知