我正在浏览 Hibernate 文档并遇到了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
我观察到 hibernate 在第 2 行本身就命中了数据库,请告诉我为什么会发生这样的情况?如果我删除 LockOptions 参数,则数据库命中将在Line 3
代替Line 2
The 锁定选项 API http://docs.jboss.org/hibernate/annotations/3.5/api/org/hibernate/LockOptions.html#READ给出的细节很少:
READ代表LockMode.READ(超时+范围不适用)
这意味着什么timeout + scope do not apply
?
UPGRADE 代表LockMode.UPGRADE(将永远等待锁定并
false 的范围意味着只有实体被锁定)
我们什么时候应该使用升级?这意味着什么scope of false meaning only entity is locked
?
对于有经验的人来说,这些可能是基本问题,请帮助我理解这里的概念。
感谢您查看我的帖子。
隔离级别会影响您所看到的内容。
锁定模式会影响您可以执行的操作。
hibernate的正常设置是读提交隔离和乐观锁。
使用乐观锁定,当两个人尝试同时编辑相同的数据时,第二个提交的人将遇到异常。
- 用户1在没有升级锁定的情况下加载DomesticCat#1066。
- 用户2在没有升级锁定的情况下加载DomesticCat#1066。
- 用户 2 更改了 cat 的名字并提交。
- 用户 1 更改了猫的生日,尝试提交,抛出异常。
如果使用悲观锁,通过选择 LockMode UPGRADE,则在请求锁升级的人释放数据之前,任何人都不得更改数据。
- 用户1加载DomesticCat#1066with升级锁。
- 用户2在没有升级锁定的情况下加载DomesticCat#1066。
- 用户 2 更改了 cat 的名称并尝试提交。在用户 1 释放锁之前不允许执行此操作,因此数据库会阻塞,用户 2 的会话将处于等待状态。
- 用户 1 更改了猫的生日并提交。
- 用户 2 的更新现在可以尝试提交,但由于他们现在使用了乐观锁定,因此他们将是看到异常的人。
升级时加载后必须立即执行查询的原因是它是使用select ... for update
语句和 hibernate 向您保证,当该方法返回时您将获得锁,因此它必须立即执行该语句。当您不需要持有锁时,hibernate 可以偷懒并推迟加载数据,直到您表明您确实需要它。
通常,当您执行以下操作时,您会升级锁定级别must无论其他人在做什么,都要完整。例如,当它是用户时,您可以向他们显示错误,他们可以调整他们的工作并重试。但是,如果更新是由消息传递服务器或后台进程进行的,则处理异常并重试可能会非常复杂,因此最好锁定记录,以便确保更新进入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)