gpt4 book ai didi

java - Spring mongo 线程安全

转载 作者:行者123 更新时间:2023-12-03 20:51:55 25 4
gpt4 key购买 nike

我正在学习 Spring Boot 和并发。我知道当spring boot收到多个请求时,它会启动多个线程来处理请求。我这里有一个访问 mongo 的方法。此方法将保存一个新的 someResult(可能包含调用者设置的一些新值)。我的问题是,如果我的 spring boot Controller 有 100 个并发调用,并且我得到 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);
}

最佳答案

是的,有可能 2 个线程先读取结果,然后进行修改,然后每个线程将修改写入数据库。数据库状态以其中一个值结束 - 后一个,较早的写入丢失 - 这称为丢失更新现象。
除了使用具有足够隔离级别的事务之外,您还可以使用乐观锁定。

The @Version annotation provides syntax similar to that of JPA in the context of MongoDB and makes sure updates are only applied to documents with a matching version. Therefore, the actual value of the version property is added to the update query in such a way that the update does not have any effect if another operation altered the document in the meantime. In that case, an OptimisticLockingFailureException is thrown. The following example shows these features:


https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.optimistic-locking
在您的代码中,您可以决定是否要在抛出异常时重试整个操作,或者是否向用户报告错误。

关于java - Spring mongo 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62432698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com