mongodb启动不能锁定
从JPA迁移到MongoDb时,您开始认识到您以前认为理所当然的JPA功能有多少。 JPA通过悲观锁定和乐观锁定来防止“丢失的更新”。 乐观锁定不会最终锁定任何内容,因此最好将其命名为无乐观锁定或乐观并发控制,因为无论如何它都是这样做的。
那么,“丢失更新”是什么意思?
一个真实的例子是多个后台任务更新某个公共实体的不同属性时。
在我们的示例中,我们有一个带有数量和折扣的产品实体,由两个单独的批处理者解决。
- 库存批次以{数量:1,折扣:0}加载产品
- 库存会更改数量,因此我们有{数量:5,折扣:0}
- 折扣批次以{数量:1,折扣:0}加载产品
- 折扣会更改折扣,因此我们有{数量:1,折扣:15}
- 库存可节省产品{数量:5,折扣:0}
- 折扣可节省产品{数量:1,折扣:15}
- 保存的数量为1,并且库存更新丢失
在JPA中,您可以提供@Version字段(通常是一个自动递增的数字),其余部分由Hibernate处理。 幕后有一个安全机制,可以在给定特定版本时检查更新的行号。 如果没有更新任何行,则说明版本已更改,并且引发了乐观锁定异常。
UPDATE Product
SET quantity=1, discount=15
WHERE version=1;
但是,如果您的存储不是RDBMS系统而是Mongo数据库,则您仍然希望防止更新丢失。 幸运的是, Spring Data提供了一组面向文档的注释,您可以在其中找到@Version注释,该注释的语义与其JPA对应的注释相同,因此可以挽救生命 。
还应该使用自动重试机制,因为乐观锁定异常是可恢复的异常。 它只需要重新加载最新的实体快照,合并特定的属性并进行更新。
因此,Spring Data提供的不仅仅是基础存储库支持和简单的查询自动化。 乐观锁定附件可提供应用程序QoS所需的适当级别的写入一致性。
- GitHub上的代码
翻译自: https://www.javacodegeeks.com/2013/11/mongodb-optimistic-locking.html
mongodb启动不能锁定