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,对吗?是否也可以支持删除?文档链接如果文档指定了要使用的版本注释的完全限定路径,最后在这里验证这一点,则会更有帮助。