gpt4 book ai didi

java - hibernate 锁定模式/锁定选项

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:57 24 4
gpt4 key购买 nike

我正在浏览 Hibernate 文档并遇到了 LockModes。这些是否与我们用于数据库的隔离级别相同?它们与隔离级别有何不同?

我正在尝试一个简单的示例,并观察到当我使用 session.load() 方法本身时 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

API for LockOptions很少详细说明它们是什么:

READ represents LockMode.READ (timeout + scope do not apply)

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

UPGRADE represents LockMode.UPGRADE (will wait forever for lock and scope of false meaning only entity is locked)

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

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

谢谢你看我的帖子。

最佳答案

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

锁定模式会影响您可以执行的操作。

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

使用乐观锁,当两个人试图同时编辑相同的数据时,第二个提交的人会得到一个异常。

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

如果正在使用悲观锁,通过选择 LockMode UPGRADE,在请求 Lock UPGRADE 的人释放数据之前,不允许其他人更改数据。

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

升级时必须在加载后立即执行查询的原因是它是使用 select ... for update 语句实现的,而 hibernate 向您保证您将拥有锁当该方法返回时,它必须立即执行该语句。当您不需要持有锁时,hibernate 可以延迟加载数据,直到您表明您确实需要它。

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

关于java - hibernate 锁定模式/锁定选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21030740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com