当前位置: 首页 > 知识库问答 >
问题:

当我们提供了事务管理API时,为什么Hibernate中的自动提交默认为false?

龚昊然
2023-03-14

当我们提供了事务管理API时,我不清楚为什么在Hibernate中自动提交默认为false。我有三个问题

>

  • 为什么Hibernate不推荐自动提交模式?

    当我们使用autocommit = true,然后使用Hibernate Transaction apis进行事务管理时会发生什么?

    当使用Spring声明性事务管理时,@Transactional(readonly=true)将如何帮助我们编写的只读代码(Hibernate代码)?

  • 共有2个答案

    韩麒
    2023-03-14

    关于第(1)项:

    假设您拥有一家公司并拥有 1000 名员工。您维护一个数据库表来跟踪员工是否已在月底获得工资。

    所以,我们到了,月底发薪日。工资单会向您发送一个excel文件,其中包含刚刚收到上个月薪酬的600名员工。因此,您登录到计算机并启动java应用程序,然后选择excel保存数据库中的所有600条记录。通常需要2分钟,但现在1分23秒就失败了。你现在的期望是什么?你希望一个部分上传的文件中有多少条记录,或者什么都没有?您的自动提交将驱动它:如果autocommit=false,那么您可以尝试一次又一次地上传整个文件,但如果autocommit=true,您可能需要首先调整输入数据以删除一些记录,以防止数据库中出现重复。

    我希望,我的简化示例可以帮助您更好地理解它,但实际上的目的是确保将批处理中的所有内容(它包括每个写入操作,如插入/更新/删除)保存在数据库中,或者确保在此过程中随时发生错误时什么都不做。在现实生活中,在大多数情况下,您和您的组织将期望数据库中的完整数据集而不是部分数据集。理解它是关键,任何建议“使用autocommit=true,因为它是安全的”的人都应该避免里程。这是一个关键概念,也是数据管理的基础之一。

    常茂
    2023-03-14

    我将逐一回答从(2)开始,因为我对(1)了解不多

    (2):autocommit=true 表示默认情况下提交所有查询。在这种情况下,如果

    >

  • 如果方法上有@Transactional,它将覆盖自动提交并将所有查询封装到单个事务中,从而覆盖自动提交

    如果有一个@Transactional方法调用其他@Transactional带批注的方法,则最外层的注释应覆盖内部注释并创建更大的事务,因此注释也会相互覆盖。

    (3):在像Oracal/Mysql这样的DBs中,只读事务可以转换READ_ONLY级别,它不提供脏读,不提供不可重复的读取,但不允许任何更新。这意味着刷新模式将在当前Hibernate会话中设置为FlushMode.NEVER,以防止会话提交事务。即使setReadOnly(true)也将在JDBC连接上调用,这确保您不能调用session.flsuh(),即使是手动刷新会话。

    由于Spring本身不做持久性,它不能指定readOnly应该确切意味着什么。此属性只是对提供程序的提示,在本例中,行为取决于 Hibernate。

  •  类似资料:
    • 问题内容: 在Swift中处理可选选项的习惯用法似乎过于冗长,如果您只想在nil为零的情况下提供默认值,则它是: 涉及不必要地复制代码,或 这不需要是常数。 Scala的Option monad(与Swift的Optional基本相同)具有用于此目的的方法: 我想念什么吗?Swift已经有一种紧凑的方式做到这一点吗?否则,是否可以在扩展名中为Optional 定义? 问题答案: 更新资料 苹果现在

    • 当我编译以下代码时,我看到了与哈希相关的错误。 /tmp/ccCQFQ4N.o: 在函数“标准::__detail::_Hash_code_base ,标准::矢量 然后,我介绍了下面自己的Hash,问题就解决了。 问题 1 警告:基类“结构”std::unary_function,无符号整型 问题2 非常感谢。

    • 我有以下方法调用层次结构 在上面的场景中,我的期望是Spring应该在线程从Method od1出来时提交事务,或者如果在层次结构中的任何位置发生异常,则回滚。 但是Spring在方法2中执行更新后立即提交事务。我不明白为什么? 更新:-即使我将事务更改为事务(传播=传播。需要\u NEW),它仍会提交事务。所以没有影响

    • 问题内容: 我一直想知道为什么JDBC API提供了自动提交模式()。似乎很吸引人的麻烦只是诱使人们陷入麻烦。我的理论是,仅将其添加到JDBC是为了简化希望创建使用JDBC编辑和运行SQL的工具的供应商的生活。是否有其他原因打开自动提交,还是总是错误? 问题答案: 不幸的是,使用自动提交是特定于数据库的(事务行为也是如此)。我认为,如果您没有全局的程序化交易策略,自动提交可能比仅希望每个人都正确关

    • 使用HttpServletRequestWrapper包装HttpServletRequest的目的是什么?我们这样做有什么好处?

    • 我正试图用ANT构建脚本编译我的项目。当我更改Eclipse工作区的默认JRE时,假设JDK1.6.0_27 32位,ANT仍然使用JRE 1.7.0 64位(这是系统默认值) 有一个选项设置ANT构建文件使用不同的java版本通过设置外部工具配置,选择ANT构建文件和选择相关的java在JRE选项卡,但这是奇怪的,因为有选项在同一个地方使用运行在相同的JRE作为工作区,这对我不起作用(运行Ecl