Java 如何在Spring Data MongoDB中使用乐观锁定?
我正在浏览,我发现这些例子有点过于简单化了 我特别想了解如何在并发环境中处理过时的数据。例如,假设我有以下实体:Java 如何在Spring Data MongoDB中使用乐观锁定?,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,我正在浏览,我发现这些例子有点过于简单化了 我特别想了解如何在并发环境中处理过时的数据。例如,假设我有以下实体: public class Person { private final String username; private final String firstname; private final String lastname; [...] } 现在,如果我使用crudepository保存/更新/删除我的实体,那么想象一个场景,其中两个线程
public class Person {
private final String username;
private final String firstname;
private final String lastname;
[...]
}
现在,如果我使用crudepository
保存/更新/删除我的实体,那么想象一个场景,其中两个线程检索同一实体,其中一个将其删除,另一个更新其lastname
字段。如果delete
调用在save
调用之前完成,则我的实体将被删除,然后重新创建,此时save
操作的预期行为将失败
到目前为止,我已经看到了两种解决这个问题的方法:
@Version
注释。找不到任何说明Spring数据支持使用版本化文档在MongoDB中进行乐观锁定的文档。如果有人能给我指一个链接,我将不胜感激MongoOperations.find和modify
并在返回null
时失败。这种方法的缺点是,我无法再实现我的存储库API,使其具有“获取实体”和“保存更新的实体”之类的语义。e、 g:
User user = userRepository.findByUsername("uniqueUsername");
user.setLastName("Archer");
userRepository.update(user);
userRepository.updateLastname("uniqueUsername", "Archer");
但我有点担心,如果我想做的每一种更新都需要一种新方法,那么我的存储库接口将无法控制地增长
我意识到我实际上还没有提出一个问题,所以这里是这样的:使用Spring Data for MongoDB设计应用程序的最佳实践是什么?在属性上使用
@org.springframework.Data.annotation.Version
。我创建此项是为了改进文档。如果我理解正确,只有在更新时才会抛出OptimisticLockException,对吗?是否也可以支持删除?文档链接如果文档指定了要使用的版本注释的完全限定路径,最后在这里验证这一点,则会更有帮助。