如何在Spring Data MongoDB中使用乐观锁定?

我正在浏览Spring Data MongoDB - 参考文档,我发现这些例子有点过于简单。

特别是,我正在尝试了解如何在并发环境中处理过时的数据。例如,假设我有以下实体:

public class Person {

    private final String username;
    private final String firstname;
    private final String lastname;

    [...]

}

现在,如果我使用保存/更新/删除我的实体,那么想象一个场景,其中两个线程检索同一个实体,其中一个线程删除它,另一个线程更新其字段。如果调用在调用之前完成,则我的实体将被删除,然后重新创建,此时预期的行为将是操作失败。CrudRepositorylastnamedeletesavesave

到目前为止,我已经看到了两个解决此问题的选项:

  1. 使用批注。找不到任何文档说Spring Data支持使用版本化文档在MongoDB中进行乐观锁定。如果有人能给我指出一个链接,那将不胜感激。@Version
  2. 如果返回 ,则使用并失败。这种方法的缺点是,我无法再实现我的存储库API来具有“获取实体”和“保存更新的实体”类型的语义。例如:MongoOperations.findAndModifynull

    User user = userRepository.findByUsername("uniqueUsername");
    user.setLastName("Archer");
    userRepository.update(user);
    

我必须将其中一些推送到存储库,我猜:

userRepository.updateLastname("uniqueUsername", "Archer");

但是我有点担心,如果我想做的每种类型的更新都需要一种新的方法,我的存储库接口会不受控制地增长。

我意识到我还没有真正说过一个问题,所以在这里:使用MongoDB的Spring Data设计应用程序的最佳实践是什么?


答案 1

在属性上使用应该可以解决问题。我创建了DATAMONGO-1275来改进这方面的文档。@org.springframework.data.annotation.Version


答案 2