当前位置: 首页 > 面试题库 >

休眠LockModes / LockOptions

巫马正卿
2023-03-14
问题内容

我正在通过Hibernate Documentation遇到一个问题LockModes。这些与Isolation levels我们用于数据库的相同吗?它们有何不同Isolation levels

我正在尝试一个简单的示例,并观察到当我使用session.load()方法本身时,hibernate状态正在命中数据库,而不是在加载对象上调用某些方法时,hibernate状态正在命中数据库。

session.beginTransaction(); //Line 1
DomesticCat d1 = (DomesticCat)session.load(DomesticCat.class, 1L,LockOptions.UPGRADE); //Line 2
d1.meow(); //Line 3
session.getTransaction().commit(); //Line 4

我观察到hibernate在第2行本身命中了数据库,请告诉我为什么会这样发生?如果我删除LockOptions参数,那么将命中数据库Line 3而不是数据库Line 2

LockOptions的API几乎没有提供有关它们的详细信息:

READ表示LockMode.READ(超时+范围不适用)

这是什么意思timeout + scope do not apply

UPGRADE表示LockMode.UPGRADE(将永远等待锁定,并且作用域为false意味着只有实体被锁定了)

什么时候应该使用UPGRADE?那是什么意思scope of false meaning only entity is locked

可能这些是有经验的人的基本问题,请在这里帮助我理解概念。

感谢您查看我的帖子。


问题答案:

隔离级别会影响您看到的内容。

锁定模式会影响您的操作。

hibernate的正常设置是提交读取的隔离和乐观锁。

使用乐观锁定,当两个人尝试同时编辑同一数据时,第二个提交的人将获得异常。

  1. 用户1加载没有升级锁的DomesticCat#1066。
  2. 用户2加载没有升级锁的DomesticCat#1066。
  3. 用户2更改cat的名称并提交。
  4. 用户1更改猫的生日,尝试提交,抛出异常。

如果使用悲观锁,则通过选择LockMode UPGRADE,将不允许其他任何人更改数据,直到要求Lock UPGRADE的人释放它为止。

  1. 用户1 使用 升级锁定加载DomesticCat#1066 。
  2. 用户2加载没有升级锁的DomesticCat#1066。
  3. 用户2更改cat的名称并尝试提交。在用户1释放锁定之前,不允许执行此操作,因此数据库将阻塞并且用户2的会话将坐下等待。
  4. 用户1更改猫的生日,提交。
  5. 用户2的更新现在可以尝试提交,但是由于他们现在使用了乐观锁定,因此他们将是看到异常的人。

升级时必须在加载后立即执行查询的原因是,该查询是使用该select ... for update语句实现的,并且Hibernate承诺当该方法返回时您将拥有锁,因此它必须立即执行该语句。当您不需要按住锁时,hibernate状态可能会变得很懒惰,并会延迟加载数据,直到您表明确实需要它为止。

通常,当您具有 必须
完成的操作而不论其他人在做什么时,都可以升级锁定级别。例如,当它是用户时,您可以仅向他们显示错误,他们可以调整其工作并重试。但是,如果更新是由消息传递服务器或后台进程进行的,则处理异常并重试可能会非常复杂,因此仅锁定记录可能会更好,这样可以确保更新得以进行。



 类似资料:
  • 问题内容: 我有一个hibernate映射,该映射一直工作到最近-尽管我确定这是我所做的某些更改的结果,但我似乎找不到它。 映射文件将字段定义为: 该类将该字段定义为: 运行此代码时,出现以下错误: 与此对应的数据库字段定义为: 我还有其他几个具有相似结构和定义的类,并且它们没有问题。但是,可能由于我最近所做的一些更改而导致,此特定映射将不再正常工作。 有什么建议么? 问题答案: 我不确定,但是您

  • 问题内容: 我收到了一个我无法解释的奇怪的Hibernate异常。告诉我我正在使用二级缓存,但是没有在哪里指定二级缓存。这是例外: 而我的: 有什么想法会触发此异常吗?提前致谢! 问题答案: Pau在hibernate.cfg.xml中写了hibernate.cache.region.factory_class: 唯一的例外是不言而喻的。您必须设置 属性。例如,使用ehcache将添加以下行: n

  • 问题内容: 有人可以透视一下JPA和Hibernate之间的区别吗?还是将这些互补的概念一起使用? 问题答案: 大致来说,JPA是java社区的一个标准,这里是specs,它是由Hibernate家伙实现(并扩展)的(此处提供一些信息)。作为规范,您将不会直接使用JPA,而是使用JPA实现。 请注意,如果要使用hibernateJPA扩展,将破坏与其他JPA实现的兼容性(尽管有些人会说“为什么要使

  • 问题内容: 我有一个Spring和Hibernate3在生产中运行良好的应用程序。以下是Spring的applicationContext.xml中会话工厂的配置 生产正常。 现在,对于另一个项目,我们正在迁移到Hibernate4。我们使用org.springframework.orm.hibernate4。*包中的Hibernate 4的SessionFactory,TransacionMan

  • 问题内容: 这是我在堆栈上的第一个问题,请保持温柔:D 我正在尝试创建休眠的OneToMany关系。当我尝试从数据库中获取一些数据时,出现了StackOverflowError。但是,当我删除OneToMany部分时,一切正常。这是我的REST服务的一部分,目前它可以在VMware vFabric Server和MySQL DB上运行。 获取示例: MySQL脚本: 类: 错误: 编辑: 感谢@T

  • 问题内容: 我正在使用JBoss Embedded 版本beta3.SP10,并且遇到了应该在某些Hibernate版本中修复的持久性错误。可悲的是,我不知道在我的JBoss Embedded中使用了什么版本的Hibernate,也找不到找到此信息的方法,它捆绑的文件中没有 类,也不包含MANIFEST。 我如何不使用就可以找到当前加载的Hibernate版本? 问题答案: 尝试这个, 在这里找到