当前位置: 首页 > 知识库问答 >
问题:

使用@Version或LockMode在Hibernate中实现乐观锁定。乐观或两者皆有

满勇军
2023-03-14

我读到我们可以使用<code>@version</code>在hibernate中使用version字段实现乐观锁定。然后,通过阅读悲观锁定,我知道了<code>org.hidbernate。LockMode</code>类,它有一些选项,如<code>LockMod。我们可以在session.load()中指定的OPTIMISTICetc。

所以我的问题是我是否需要同时使用LockMode.OPTY@Version

共有1个答案

章琛
2023-03-14

是的。它们一起工作,您可以使用@Version而没有LockMode.OPTIMISTIC,但您不能使用LockMode.OPTIMISTIC而没有@Version

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

有时您需要“更改”一个实体而不真正更改它。这往往非常罕见。例如,想象有一个Foo对象,它有一个模式字段和一个Bar对象,它有一个字段。如果模式LOUD,则可以是0-100。如果模式QUIET,则只能是0-10。

如果一个用户在另一个用户更改音量(从5到50)的同时更改模式(从LOUDQUIETFoo实体上的版本列,而第二个用户递增并且检查Bar实体的版本列。

一种解决方案是让LockMode.OPTIMISTIC函数在Foo对象上获取LockMode.OPTIMISTIC锁。这告诉HiberNate,即使此函数不修改Foo对象,它仍然需要递增并检查版本字段。

 类似资料:
  • 乐观锁Version 要使用乐观锁,需要使用version标记 type User struct { Id int64 Name string Version int `xorm:"version"` } 在Insert时,version标记的字段将会被设置为1,在Update时,Update的内容必须包含version原来的值。 var user User engine

  • 问题内容: 我试图按顺序实施乐观锁定,以避免丢失更新情况。在我的应用程序中,当两个用户获取相同的记录,而第一个用户通过一些更改对其进行更新时。查看相同记录的第二个用户看不到此更改,并且他自己进行了一些更改并更新了该记录。因此,第一人称更改丢失。为了防止这种情况,我写了以下内容,但问题仍然存在。我是这个概念的新手,无法发现问题。 我试图通过阅读doc 11.3.4 来实现这一目标。自定义自动版本控制

  • 我有一个带有和的微服务。我使用注释对中的表执行操作。我遇到的问题是保存操作花费了太多的时间,所以我希望读取操作不被它阻塞。注意,保存是通过持久化实体来执行的。 当前,在所有并发保存操作完成之前,所有读取操作都不会返回结果,这意味着表被锁定。相反,我希望实现乐观锁定。我怎样才能做到呢?

  • 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也

  • 问题内容: 我找不到有关MySQL中乐观锁定的任何详细信息。我读到开始事务使两个实体上的更新保持同步,但是,它不会停止两个用户同时更新数据而引起冲突。 显然乐观锁定会解决这个问题吗?这在MySQL中如何应用。是否有SQL语法/关键字呢?还是MySQL具有默认行为? 谢谢你们。 问题答案: 关键是,乐观锁定不是数据库功能,不适用于MySQL或其他功能:乐观锁定是一种使用带有标准指令的DB进行的实践。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html