加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Spring Data Mongodb 乐观锁

发布时间:2020-12-15 06:41:02 所属栏目:Java 来源:网络整理
导读:Spring Data 针对mongodb提供了乐观锁实现: The @Version annotation provides syntax similar to that of JPA in the context of MongoDB and makes sure updates are only applied to documents with a matching version. Therefore,the actual value of

Spring Data 针对mongodb提供了乐观锁实现:

The @Version annotation provides syntax similar to that of JPA in the context of MongoDB and makes sure updates are only applied to documents with a matching version. Therefore,the actual value of the version property is added to the update query in such a way that the update does not have any effect if another operation altered the document in the meantime. In that case,an OptimisticLockingFailureException is thrown. The following example shows these features:

提供@Version注解,用来标识版本,保存、删除等操作会验证version,不一致会抛出OptimisticLockingFailureException

来看一个例子:

@Document
class Person {

  @Id String id;
  String firstname;
  String lastname;
  @Version Long version;
}

Person daenerys = template.insert(new Person("Daenerys"));                            (1)

Person tmp = template.findOne(query(where("id").is(daenerys.getId())),Person.class); (2)

daenerys.setLastname("Targaryen");
template.save(daenerys);                                                              (3)

template.save(tmp); // throws OptimisticLockingFailureException                       (4)
  1. 最初插入一个person daenerysversion0

  2. 加载刚插入的数据,tmpversion还是0

  3. 更新version = 0daenerys,更新lastname,save后version变为1

  4. 现在来更新,会抛出OptimisticLockingFailureException, 提示操作失败。

注意:

Important Optimistic Locking requires to set the?WriteConcern?to?ACKNOWLEDGED. Otherwise?OptimisticLockingFailureException?can be silently swallowed.
Note As of Version 2.2?MongoOperations?also includes the?@Version?property when removing an entity from the database. To remove a?Document?without version check use?MongoOperations#remove(Query,…?)?instead of?MongoOperations#remove(Object).
Note As of Version 2.2 repositories check for the outcome of acknowledged deletes when removing versioned entities. An?OptimisticLockingFailureException?is raised if a versioned entity cannot be deleted through?CrudRepository.delete(Object). In such case,the version was changed or the object was deleted in the meantime. Use?CrudRepository.deleteById(ID)?to bypass optimistic locking functionality and delete objects regardless of their version.

作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读