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

标签 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 来保存/更新/删除我的实体,然后想象一个场景,其中两个线程检索同一个实体,其中一个删除它,另一个更新它的 姓氏字段。如果 delete 调用在 save 调用之前完成,那么我的实体将被删除然后重新创建,此时预期的行为将是 save 操作失败。

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

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

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

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

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

但我有点担心,如果我想做的每一种更新都需要新方法,我的存储库接口(interface)会变得无法控制。

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

最佳答案

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

关于java - 如何在 Spring Data MongoDB 中使用乐观锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32085113/

相关文章:

mongodb - Mongoose 模式中的嵌套 map

mongodb - MongoDB Java API 中的 TDocument 是什么以及在哪里

spring - AWS集成 Spring : Extend Visibility Timeout

java - 创建名称为 'resourceHandlerMapping' 的 bean 时出错

node.js - Mongodb条件查找

Java 8 不呈现货币符号

java - 多 Maven 项目的 Spring AOP 问题

java - 如何设置平铺可绘制对象的大小

java - 如果我将 InputStream 的对象保存到内存中,是否意味着我将整个文件存储到内存中?

java - 在不反序列化的情况下从 JSON 字符串中的任何位置删除键