Hibernate 锁定模式/锁定选项

2024-01-10

我正在浏览 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. 用户1在没有升级锁定的情况下加载DomesticCat#1066。
  2. 用户2在没有升级锁定的情况下加载DomesticCat#1066。
  3. 用户 2 更改了 cat 的名字并提交。
  4. 用户 1 更改了猫的生日,尝试提交,抛出异常。

如果使用悲观锁,通过选择 LockMode UPGRADE,则在请求锁升级的人释放数据之前,任何人都不得更改数据。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 锁定模式/锁定选项 的相关文章

  • 如何在 Spring 中从 application.properties 重新加载 @Value 属性? [复制]

    这个问题在这里已经有答案了 我有一个spring boot应用 在run文件夹下 有一个额外的配置文件 dir config application properties 当应用程序启动时 它使用文件中的值并将它们注入到 Value my
  • 何时在java中使用get/set方法[重复]

    这个问题在这里已经有答案了 我想知道何时在我的类中使用 get 和 set 方法 getName setName 以及何时简单classVariable name 反而 classVariable getName 这是使用 set 和 ge
  • 使用 TLS 证书 JDBC 连接到 Oracle 数据库

    我正在尝试用 Java 编写一个连接类来使用 JDBC 驱动程序连接到 Oracle 数据库 但我想保护用于连接到 Oracle 数据库的参数 例如 jdbcurl 用户名 密码 我必须使用 TLS 证书概念来连接到 Java 中的 Ora
  • Java如何从字符串实例化一个类[重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 中从变量创建新类 https stackoverflow com questions 1268817 create new class from a variable in java 我
  • Java - 直观地拖动摆动元素

    有没有类似的解决方案http allen sauer com com allen sauer gwt dnd demo DragDropDemo DragDropDemo html PaletteExample http allen sau
  • Java 正则表达式中 \w 和 \b 的 Unicode 等效项?

    许多现代正则表达式实现解释 w字符类简写为 任何字母 数字或连接标点符号 通常 下划线 这样 正则表达式就像 w 匹配像这样的词hello l ve GO 432 or gefr ig 不幸的是 Java 没有 在爪哇 w仅限于 A Za
  • 为什么LocalSessionFactoryBean不实现getCurrentSession,而SessionFactory的实例却可以调用该方法?

    这是我的 Spring Bean 配置
  • 外键必须与引用的主键具有相同的列数

    我知道这个话题在这里讨论了很多次 但我仍然坚持一个例外 外键必须与引用的主键具有相同的列数 我正在使用 spring data 和 hibernate 我的ID类别 Embeddable public class ProxyDienstRe
  • 为什么 Java 类加载器找不到我的接口?

    在下面的代码中 我使用动态生成一个类sun tools javac Main 我将使用反射创建此类的新实例 问题是 我想避免使用 Reflection 来调用我为此类定义的方法 因此我创建了一个 ProxyInvoker 来引用我在项目中定
  • Java 8 流排序字符串列表[重复]

    这个问题在这里已经有答案了 我正在流上调用排序方法 java 文档说 Sorted 方法返回一个由该流的元素组成的流 并根据自然顺序排序 但是当我运行下面的代码时 List
  • 如何仅使用命令行运行 Maven 创建的 jar 文件

    我需要一些帮助来尝试使用命令行运行以下 Maven 项目 https github com sarxos webcam capture https github com sarxos webcam capture webcam captur
  • Spring WebFlux:在 Spring Data MongoDB 反应存储库中的 null 值时发出异常?

    我正在尝试学习如何使用 MongoDB 反应存储库spring boot 2 0 0 M2 但我担心我没有按预期做事 这是我的方法之一 试图找到一个User通过他们的电子邮件 但如果没有 该方法应该抛出异常 Override public
  • Grails/GORM“符合”标准

    是否可以使用 GORM 标准执行 in 标准 我正在寻找与以下 SQL 等效的内容 select from Person where age in 20 21 22 如果可能的话 我想语法会是这样的 def results Person w
  • 如何在使用 Web 服务时获取会话对象?

    如何在使用 Web 服务时获取会话对象 服务在两个程序之间调用 如何在使用 Web 服务时获取用户会话对象 不可能使用请求对象获取会话 因为当我们谈论服务时不会有请求或响应 如果您正在与JAX WS https jax ws dev jav
  • 使用 Arrays.copyOf 复制不同类型的数组时出现问题

    我正在尝试创建一个方法 该方法几乎将任何内容作为参数 并返回带有某些分隔符的值的串联字符串表示形式 public static String getConcatenated char delim Object names String st
  • CellTables 和 css (GWT)

    有人可以帮我设置 CellTable 行的背景吗 拜托 我整晚都在努力做这件事 但一直失败 这是 让我发疯 我尝试过调用setRowStyles 但是那个 似乎不起作用 我读到你无法更改 设置样式后 CellTable 的样式 作为默认样式
  • 无法使用 jolokia 从 Kafka 提取 JMX 数据

    我已经在 centos 7 机器上安装了 Jolokia 并尝试使用 Jolokia 代理提取 Kafka 指标 并使用 Nagios 插件 check jmx4perl 与 Icinga 监控工具集成 以下是我遵循的配置步骤 步骤1 下载
  • 注意通知持续时间

    是否可以将抬头通知的持续时间设置为无限 现在它只显示 5 秒 已经尝试过不同的事情 例如更改类别 但持续时间始终为 5 秒 这是我的代码 Notification notification notificationBuilder setCa
  • 我们还需要迭代器设计模式吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Maven 将值附加到文件中

    我想在文件末尾附加一个值 但我无法确定要使用哪个插件 例子 我要附加的值 myValue file value1 value2 myValue 追加后 我知道我可以使用 antrun plugin 来做到这一点 但是可以使用 Maven 插

随机推荐

  • 为什么 POST 请求中出现“Content-Length: 0”?

    客户有时会发送 POST 请求Content Length 0提交表单时 10 到 40 多个字段 我们使用不同的浏览器和不同的位置对其进行了测试 但无法重现该错误 客户正在使用 Internet Explorer 7 和代理 我们要求他们
  • 在Android中获取麦克风声音级别(分贝级别)

    我对 Android 很陌生 我已经搜索了很长一段时间了 我想构建一个类似于分贝计的应用程序 它实时显示声音级别 如果房间里噪音很大 就会有一些指示 如果房间很安静 就会有一些指示 我根本不知道如何做到这一点 谁能解释一下麦克风声级应用的基
  • 是否有指向成员特征或类似内容的指针?

    基于其他我的问题 https stackoverflow com questions 1913541 how to save pointer to member in compile time 考虑下面的代码 template
  • JQuery 查找性能

    我发现这个 var colSelect stuff find things colSelect find img input select addClass foo 比这个慢 var colSelect stuff find things
  • 为什么我应该阻止直接访问不回显任何内容的 PHP 文件?

    例如 如果我有一个邮件脚本或一个写入数据库的脚本 脚本不会回显任何重要的内容 除了感谢或错误消息 但会执行许多重要的后端工作 直接访问它们可能存在哪些安全问题 是否值得阻止直接访问此类文件 他们正在使用接收数据 POST GET通过联系表格
  • 如何阻止 Python 的 Requests 库去除转义字符?

    我收到一个如下所示的 JSON 块 为简洁起见进行了编辑 actions script inputs
  • 如何用CSS相对对齐文本?

    我寻求对齐等号在我的方程中 我尝试了 span 和 div 但对齐结束于内容大小 gt RHS https jsfiddle net gytmx256 6 https jsfiddle net gytmx256 6 span class c
  • 如何使用 Retrofit 2 处理空响应正文?

    最近我开始使用 Retrofit 2 并且遇到了解析空响应正文的问题 我有一个仅使用 http 代码响应的服务器 响应正文中没有任何内容 如何仅处理有关服务器响应的元信息 标头 状态代码等 Edit 正如杰克 沃顿指出的那样 GET pat
  • 对于旧版浏览器,Azure 应用服务中的 HTTP/2 是否会自动回退到 HTTP/1.1

    我想为 Azure 应用服务托管的 Web 应用程序启用 HTTP 2 但是 我的用户中有 1 使用不支持 HTTP 2 的浏览器 即使我打开了 HTTP 2 Azure 应用服务是否会自动回退到这些浏览器的 HTTP 1 1 换句话说 当
  • 使用 JavaScript 关闭 Elementor 弹出窗口

    我有一个使用 Elementor 创建的弹出窗口 打开时会播放视频 我试图让它在视频结束后关闭 比如 90 秒 但我找不到如何使用 Javascript 关闭元素或弹出窗口 我尝试过这样的事情https github com element
  • 在“RKObjectManager”类型的对象上找不到属性“managementObjectStore”

    我一直在尝试使用 Restkit 库的 0 20 3 版本 最近发生了一个错误 我不知道如何解决 其内容如下 在该类型的对象上找不到属性 managementObjectStore RKObjectManager 它发生在包含 object
  • 如何使用 Xcode 4.3 或应用程序加载器将应用程序提交到 App Store

    我的第一个 iOS 应用程序在 iTunes Connect 中处于 等待上传 状态 但由于应用程序加载器中的 Xcode 4 3 遇到问题 我无法将其提交到 App Store 在 Xcode 4 3 中我有 3 个配置文件 临时配置文件
  • 右表中结果为空的内连接

    我有2张桌子 餐厅和订单 每个餐厅可以有很多订单 restaurants table id name orders table id restaurant id date 我需要找到在某个日期范围内没有订单的餐厅 在订单表中 我保存订单日期
  • 变量切换方向丢失

    我是安卓新手 我编写了几个程序并在手机上试用了它们 当我切换方向时 就像我的手机重新启动程序一样 我所有的变量都被重置 事实上 唯一没有重置的是编辑文本视图中的文本 这是什么原因造成的 我怎样才能阻止它 我尝试在谷歌和堆栈溢出上查看它 但我
  • CSS calc 在 Safari 和后备中不起作用

    我正在研究这个布局 它强烈依赖 CSS calc 来进行必要的计算 width webkit calc 50 20px width moz calc 50 20px width calc 50 20px 现在 我无法让它在 Safari 中
  • NHibernate、代理和平等

    我正在使用 NHibernate 3 3 1 并发现非常有趣的问题 在我的域模型中 我定义了两个类 Carriage 和 CarriageRequest 相互引用 因为延迟加载已打开 所以当我访问carriage CarriageReque
  • 在 .NET Core 中自动创建私钥、CSR 和最终签名证书的过程

    有人向我提供了中间证书 由根证书签名 及其密码 为了安全地连接到 SSL 端点 我需要提供签名证书 这是我所做的 创建私钥 使用该私钥创建 CSR 使用提供的中级证书对其进行签名 我使用 openssl 来完成这一切 它运行得非常完美 TL
  • 服务中的断点不起作用

    我正在尝试向在单独线程上运行的服务添加断点 无论我将断点放置在服务中的哪个位置 它们总是被忽略 我确信该服务正在运行 正如我所看到的Log e在日志猫中 我的调试模式也可以正确使用 因为应用程序主线程中的任何断点都可以工作 我错过了什么吗
  • 从 Django 内部调用时,Subprocess.Popen 与交互式程序一起挂起

    我编写了一个小型 Django 应用程序 它根据用户输入执行交互式程序并将输出作为结果返回 但由于某种原因 子进程挂起 在验证日志时 我发现必须给出 n 作为对挑战的响应的地方 该响应似乎从未做出过 有趣的是 如果我从 Django 外部运
  • Hibernate 锁定模式/锁定选项

    我正在浏览 Hibernate 文档并遇到了LockModes 这些是否与Isolation levels我们用于数据库 它们有何不同Isolation levels 我正在尝试一个简单的示例 并观察到当我使用 session load 方