【问题标题】:spring data MongoDB maintaining data integrity in bulk updatespring data MongoDB在批量更新中维护数据完整性
【发布时间】:2016-04-15 15:38:31
【问题描述】:

我有一个场景,其中列出了 1000 名员工(示例如下),他们的余额在每个月末更新,其中每个员工的余额可能不同。

{
  _id:1
  name:"John"
  balance:40
},

现在执行相同操作的最佳做​​法是什么。一个一个地执行

for (Employee employee : employeeList) {
        employee.update();
    }

dropAll employees where id in (All employees ids)
mongoOperations.insert(employeeList, Employee.class);

或者第三种方法可以是

Load all employee records.
Insert employee records to a new collection say employee_temp.
Drop old collection (employee).
Rename newly inserted collection as old one (employee).

或者是他们的任何其他方式可以保证数据库数据完整性的最大成功机会以及从性能角度来看良好。

【问题讨论】:

    标签: mongodb spring-data spring-data-mongodb


    【解决方案1】:

    采用您的第一种方法。一件一件地做。而不是保存整个对象使用atomic updates,它会表现得更好。

    Query query = Query.query(Criteria.where("id").is(id));
    Update update = Update.update("balance", balance);
    mongoTemplate.findAndModify(query, update, FindAndModifyOptions.options().returnNew(true), Employee.class);
    

    您的第二个和第三个将无法扩展。不建议在运行时删除集合。重命名集合是limitations

    【讨论】:

    • 我同意你关于可扩展性的第二点。第一种方法的问题是原子更新只保证单个文档的更新,或者如果我需要将相同的余额值更新到多个对象,仍然可以正常工作,但是如果不同的员工有不同的余额,我们不能在单个查询中指定它们导致执行多个查询,从而撤销原子性保证。
    【解决方案2】:

    我们最终确定的另一种可能的方法是将我们的自定义检查点保存在 mongo 中以进行回滚或提交任何必要的内容(因为我们的数据量很小,比如只有 1000 名员工),我们首先创建一个具有新旧状态的文档对于所有员工并在开始批量更新之前先保存。如果第一个记录插入成功,我们至少有可以回滚到的 DB 状态,或者在失败的情况下进一步尝试重新执行批量更新。

    如果批量更新过程成功完成,我们会删除我们的检查点集合,如果失败,我们会重新执行对新值与员工记录不匹配的所有记录的更新。

    但是,如果您的设计允许,最好选择混合数据库,其中将事务数据保存在一些关系数据库中,其余部分依赖于 mongo。

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2017-05-13
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2010-09-24
      相关资源
      最近更新 更多