Upsert和Remove Atomicity MongoDB

时间:2016-01-04 06:11:08

标签: mongodb

是否有任何设计模式来确保文档始终是upsert / updated?

例如,

db.people.update(
   { name: "Andy", approved: false },
   {
      name: "Andy",
      rating: 1,
      score: 1,
      approved: true,
   },
   { upsert: true })

db.people.remove(
   { name: "Andy", approved: false },

因此,假设这两个操作同时发生,则可能发生以下情况:

  1. 首先删除了,所以更新的查询将失败并且 文件将被上传。
  2. 首先发生了更新,因此在这种情况下,删除将无法删除,因为查询将失败。
  3. 更新查询首先发生并成功,然后删除发生,在此 case MongoDB将尝试更新空文档。最终结果 将不会创建文档。
  4. 如何防止案件3发生?案例1和2是有意的。最终目标是始终在用户单击更新按钮时创建文档。我知道更新操作是原子的,但我不认为更新with和upsert是原子的,因为来自MongoDB的以下语句。

    考虑多个客户端何时使用upsert发出以下更新:同时为true:如果所有update()操作在任何客户端成功插入数据之前完成查询部分,并且名称字段上没有唯一索引,然后每次更新操作都可能导致插入。

    我们将更新查询为(Q),我们将更新/ upsert作为(U)。删除了另一个原子操作(R),

    1. 案例1:QUR - >无法删除(文档存在)
    2. 案例2:QRU - > Upserted(文件存在)
    3. 案例3:RQU - >没有更新(没有文件)
    4. 案例4:UQR - >不可能
    5. 案例5:URQ - >不可能
    6. 案例6:RUQ - >不可能

0 个答案:

没有答案