Java 弹簧mongo螺纹安全

Java 弹簧mongo螺纹安全,java,spring-boot,concurrency,Java,Spring Boot,Concurrency,我正在学习spring引导和并发。我知道,当SpringBoot接收到多个请求时,它将启动多个线程来处理该请求。我这里有一个访问mongo的方法。此方法将保存一个新的someResult(调用方可能会设置一些新值)。我的问题是,如果有100个并发调用到我的spring boot控制器,并且我得到了someResult对象,设置了值并保存了等等,那么这些值会不一致吗 public void upsert(SomeResult someResult) { String colle

我正在学习spring引导和并发。我知道,当SpringBoot接收到多个请求时,它将启动多个线程来处理该请求。我这里有一个访问mongo的方法。此方法将保存一个新的someResult(调用方可能会设置一些新值)。我的问题是,如果有100个并发调用到我的spring boot控制器,并且我得到了someResult对象,设置了值并保存了等等,那么这些值会不一致吗

  public void upsert(SomeResult someResult) {
        String collection = this.SomeResultConfig.getCollectionSomeResultCollection();
        String queryStr = "{testingID : '%s'}";
        queryStr = String.format(queryStr, someResult.getTestingID());
        Query query = new BasicQuery(queryStr);
        List<SomeResult> someResultList = this.mongoOps.find(query, SomeResult.class, collection);
        if (someResult.size() != 0) {
            this.mongoOps.findAllAndRemove(query, collection);
        }
        this.mongoOps.save(someResult, collection);
    }
public void upsert(SomeResult SomeResult){
String collection=this.SomeResultConfig.GetCollectionSomerResultCollection();
字符串queryStr=“{testingID:'%s'}”;
queryStr=String.format(queryStr,someResult.getTestingID());
查询=新的基本查询(queryStr);
List someResultList=this.mongoOps.find(查询,SomeResult.class,集合);
如果(someResult.size()!=0){
this.mongoOps.findAllAndRemove(查询、收集);
}
this.mongoOps.save(someResult,collection);
}

MongoDB文档级操作是原子级的。因此,如果多个线程修改同一文档,则生成的文档将是这些更新操作的交错。如果这些更新操作更新公共值,则结果值将是上次更新时设置的值,这是不确定的

但是,如果您的更新操作是多步骤操作(如读取文档、在内存中修改文档并将其重写回),那么在编写文档时,无法保证您不会覆盖其他线程所做的更改。对于这些类型的更新,请考虑使用Mango事务,以便读取更新操作确保您所更新的是所读取的内容。
如果多个线程正在处理不同的文档,则不会出现任何这些问题。

是的,可能有两个线程将首先读取结果,然后进行修改,然后每个线程将修改写入数据库。数据库状态以其中一个值结束-后一个值,较早的写入丢失-这称为丢失更新现象

除了使用具有足够隔离级别的事务外,还可以使用乐观锁定

@Version注释提供了类似于MongoDB上下文中JPA的语法,并确保更新仅应用于具有匹配版本的文档。因此,版本属性的实际值被添加到更新查询中,这样,如果另一个操作同时更改了文档,则更新不会产生任何影响。在这种情况下,将抛出OptimisticLockingFailureException。以下示例显示了这些功能:


在代码中,您可以决定在引发异常时是否要重试整个操作,或者是否要向用户报告错误。

执行多个操作时,Yes值将不一致。使用事务。Mongo server 4.x版本和支持