如何使用Spring Data MongoDB进行乐观锁定?

时间:2015-08-19 01:29:09

标签: java spring mongodb spring-data spring-data-mongodb

我经历了Spring Data MongoDB - Reference Documentation,我发现这些例子有点过于简单。

特别是我试图了解如何处理并发环境中的陈旧数据。例如,假设我有以下实体:

public class Person {

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

    [...]

}

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

到目前为止,我已经看到了解决此问题的两种方法:

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

    null
  3. 我想将其中一部分推送到存储库我猜:

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

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

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

1 个答案:

答案 0 :(得分:7)

在属性上使用@org.springframework.data.annotation.Version应该可以解决问题。我已创建DATAMONGO-1275以改进相关文档。