mongodb启动不能锁定


从JPA迁移到MongoDb时,您开始认识到您以前认为理所当然的JPA功能有多少。 JPA通过悲观锁定和乐观锁定来防止“丢失的更新”。 乐观锁定不会最终锁定任何内容,因此最好将其命名为无乐观锁定或乐观并发控制,因为无论如何它都是这样做的。

那么,“丢失更新”是什么意思?

一个真实的例子是多个后台任务更新某个公共实体的不同属性时。

mongoDB 非root启动_mysql 在我们的示例中,我们有一个带有数量和折扣的产品实体,由两个单独的批处理者解决。

  1. 库存批次以{数量:1,折扣:0}加载产品
  2. 库存会更改数量,因此我们有{数量:5,折扣:0}
  3. 折扣批次以{数量:1,折扣:0}加载产品
  4. 折扣会更改折扣,因此我们有{数量:1,折扣:15}
  5. 库存可节省产品{数量:5,折扣:0}
  6. 折扣可节省产品{数量:1,折扣:15}
  7. 保存的数量为1,并且库存更新丢失

在JPA中,您可以提供@Version字段(通常是一个自动递增的数字),其余部分由Hibernate处理。 幕后有一个安全机制,可以在给定特定版本时检查更新的行号。 如果没有更新任何行,则说明版本已更改,并且引发了乐观锁定异常。

UPDATE Product
SET quantity=1, discount=15
WHERE version=1;

但是,如果您的存储不是RDBMS系统而是Mongo数据库,则您仍然希望防止更新丢失。 幸运的是, Spring Data提供了一组面向文档的注释,您可以在其中找到@Version注释,该注释的语义与其JPA对应的注释相同,因此可以挽救生命

还应该使用自动重试机制,因为乐观锁定异常是可恢复的异常。 它只需要重新加载最新的实体快照,合并特定的属性并进行更新。

因此,Spring Data提供的不仅仅是基础存储库支持和简单的查询自动化。 乐观锁定附件可提供应用程序QoS所需的适当级别的写入一致性。



参考:来自Vlad Mihalcea博客博客的JCG合作伙伴 Vlad Mihalcea 乐观地锁定MongoDB



翻译自: https://www.javacodegeeks.com/2013/11/mongodb-optimistic-locking.html

mongodb启动不能锁定