首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@Version和/或LockMode.OPTIMISTIC在Hibernate中实现乐观锁定

使用@Version和/或LockMode.OPTIMISTIC在Hibernate中实现乐观锁定
EN

Stack Overflow用户
提问于 2014-01-24 19:58:37
回答 1查看 364关注 0票数 0

我读到我们可以使用@Version的版本字段在hibernate中实现乐观锁定。然后,在阅读有关悲观锁定的文章时,我开始了解到org.hibernate.LockMode类,它有一些我们可以在session.load()中指定的选项,比如LockMode.OPTIMISTIC等。

我的问题是,我是否需要在使用@Version的同时使用LockMode.OPTIMISTIC

EN

回答 1

Stack Overflow用户

发布于 2014-01-24 22:35:10

是。它们协同工作,你可以在没有LockMode.OPTIMISTIC的情况下使用@Version,但在没有@Version的情况下你不能使用LockMode.OPTIMISTIC

使用乐观锁定时,无论何时修改实体,该实体的版本列都会递增。保存实体时,它会确保version列是第一次读取该实体时的版本,如果不是,它会抛出OptimisticLockException (这通常会导致重新启动事务)。

有时,您可能需要“更改”一个实体,而不是真正更改它。这往往是相当罕见的。例如,假设有一个具有mode字段的Foo对象和一个具有volume字段的Bar对象。如果modeLOUD,则volume可以为0-100。如果modeQUIET,则volume只能为0-10。

使用乐观锁定时,如果一个用户更改了mode (从LOUD更改为QUIET),同时另一个用户更改了volume (从5更改为50),您可能会处于糟糕的状态。这是因为第一个用户递增并检查Foo实体上的version列,第二个用户递增并检查Bar实体上的version列。

解决此问题的一种方法是让您的changeVolume函数获得Foo对象上的LockMode.OPTIMISTIC锁。这告诉Hibernate,即使此函数不修改Foo对象,它仍然需要递增并检查版本字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21332098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档