MongoDB的优化锁
当从JPA迁移到MongoDB的,你开始意识到有多少以前JPA功能能得到保留。 JPA通过悲观和乐观锁定防止"丢失更新"。乐观锁不最终锁定任何东西,所以它取名为乐观锁或是乐观并发控制。
"丢失更新"是什么意思?
现实生活中的例子是,当多个后台任务更新共同实体的不同属性时:
我们有一个产品实体带有数量和折扣属性,这两个是独立的批次处理器处理的。
- StockBatchProcessor 加载产品{数量:1,折扣:0}
- Stock更新了数量,所以我们有{数量:5,折扣:0}
- DiscountBatchProcessor加载产品{数量:1,折扣:0}
- Discount更新了折扣,所以我们有{数量:1,折扣:15}
- Stock保存产品{数量:5,折扣:0}
- Discount保存产品{数量:1,折扣:15}
- 最后保存的数量是1,Stock更新的结果丢失。
在JPA中,你可以使用@ Version字段(通常是一个自动递增的数字),Hibernate照顾一切。幕后有一个安全机制,检查更新的行数时,给出了具体的版本。如果没有行被更新,但是该版本已经改变,乐观锁定异常被抛出。
UPDATE Product SET quantity=1, discount=15 WHERE version=1;
但是,如果你的存储不是一个RDBMS系统,而是一个MongoDB数据库,你是要防止更新丢失。幸运的是,Spring Data提供了一套面向文档注释,其中你可以找到一个相同的语义的JPA@ Version注解。只需要装入最新的实体快照,合并的具体属性并更新。
相关推荐
lbyd0 2020-11-17
BigYellow 2020-11-16
sushuanglei 2020-11-12
我心似明月 2020-11-09
zhushenghan 2020-11-09
sunnnyduan 2020-10-16
不要皱眉 2020-10-14
xiaohai 2020-09-29
songxiugongwang 2020-09-22
萌亖 2020-09-17
LuckyLXG 2020-09-08
sdmzhu 2020-09-01
mkhhxxttxs 2020-09-16
xiaohai 2020-09-16
newcome 2020-09-09
jaylong 2020-08-19
大秦铁骑 2020-08-19
thatway 2020-08-19