Hibernate LockModes/LockOptions

Cha*_*nya 7 java hibernate

我正在浏览Hibernate Documentation LockModes.这些与Isolation levels我们用于数据库的相同吗?它们与众不同Isolation levels

我正在尝试一个简单的例子,并观察到当我使用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
Run Code Online (Sandbox Code Playgroud)

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

LockOptionsAPI很少提供它们的详细信息:

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

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

UPGRADE代表LockMode.UPGRADE(将永远等待锁和范围的假意义只有实体被锁定)

什么时候应该使用UPGRADE?这意味着scope of false meaning only entity is locked什么?

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

感谢您查看我的帖子.

Aff*_*ffe 18

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

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

休眠的正常设置是读取提交隔离和乐观锁定.

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

  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的会话处于等待状态.
  4. 用户1改变了猫的生日,提交.
  5. 用户2的更新现在可以尝试提交,但由于他们现在使用乐观锁定,他们将是看到异常的人.

在升级时加载后必须立即执行查询的原因是它是使用select ... for update语句实现的,而hibernate承诺在该方法返回时你将拥有锁,因此它必须立即执行语句.当你不需要持有锁时,休眠可能是懒惰的并且推迟加载数据,直到你表明你确实需要它为止.

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