如何使用Spring Data MongoDB进行乐观锁定?
我正在阅读Spring Data MongoDB – 参考文档 ,我发现这些示例有点过于简单化了。
特别是我试图了解如何处理并发环境中的陈旧数据。 例如,假设我有以下实体:
public class Person { private final String username; private final String firstname; private final String lastname; [...] }
现在,如果我使用CrudRepository
来保存/更新/删除我的实体,那么想象一下这样一个场景,其中两个线程检索同一个实体,其中一个删除它,另一个更新其lastname
字段。 如果delete
调用在save
调用之前完成,那么当预期行为导致save
操作失败时,我的实体将被删除然后重新创建。
到目前为止,我已经看到两种解决此问题的方法:
- 使用
@Version
注释。 找不到任何文档说Spring Data支持使用版本化文档在MongoDB中进行乐观锁定。 如果有人能指出我的链接,我们将不胜感激。 -
使用
MongoOperations.findAndModify
,如果返回null
失败。 这种方法的缺点是我不能再实现我的存储库API以获得“获取实体”和“保存更新的实体”类型的语义。 例如:User user = userRepository.findByUsername("uniqueUsername"); user.setLastName("Archer"); userRepository.update(user);
我想将其中的一部分推送到存储库我猜:
userRepository.updateLastname("uniqueUsername", "Archer");
但是我有点担心如果我想要做的每种类型的更新都需要一个新方法,我的存储库接口将无法控制地增长。
我意识到我还没有提出过一个问题,所以这就是:使用Spring Data for MongoDB设计应用程序的最佳实践是什么?
在属性上使用@org.springframework.data.annotation.Version
应该可以解决问题。 我已经创建了DATAMONGO-1275来改进文档。