【问题标题】:manage concurrency access mongoDB管理并发访问 mongoDB
【发布时间】:2019-06-23 13:21:57
【问题描述】:

我需要管理 mongoDB 中数据更新的并发访问。 示例:两个用户 a 和 b 连接到我的应用程序。用户 a 更新了数据,用户 b 想要更新用户 a 已经更新的相同数据,所以我希望用户 b 不能更新此数据,因为用户 a 已经更新了。

【问题讨论】:

标签: java mongodb spring-boot nosql spring-data-mongodb


【解决方案1】:

如果用户 A 和用户 B 只更新一个文档,你可以知道初始值和更新值,试试这个代码:

代码尝试更新secret字段,我们知道初始值为expertSecret

public void compareAndSet(String expertSecret, String targetSecret) {
    // get a mongodb collection
    MongoCollection<Document> collection = client.getDatabase(DATABASE).getCollection(COLLECTION);
    BasicDBObject filter = new BasicDBObject();
    filter.append("secret", expertSecret);
    BasicDBObject update = new BasicDBObject();
    update.append("secret", targetSecret);
    collection.updateOne(filter, update);
}

如果不知道初始值怎么办?

您可以在代表操作中添加一个文件,并在更新之前检查该文件。

如果需要更新多个文档,怎么办? 多文档交易需要mongo服务器支持,更多信息请咨询here

但是,对于需要原子性来更新多个文档或读取多个文档之间的一致性的情况,MongoDB 提供了针对副本集执行多文档事务的能力。多文档事务可以跨多个操作、集合、数据库和文档使用。多文档交易提供了一个“全有或全无”的命题。

【讨论】:

  • 谢谢,我会尝试添加一个字段并在更新之前检查它。有没有办法在 mongodb 中使用 spring 数据生成一个序列,在每次更新或插入后自动递增?
  • Mongodb 有一个$inc 运算符,您可以在Spring Data 中找到相同的操作
猜你喜欢
  • 2016-11-21
  • 2022-10-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多