【问题标题】:HibernateTemplate fall back to auto-commit, where?HibernateTemplate 回退到自动提交,在哪里?
【发布时间】:2014-11-07 13:04:59
【问题描述】:

HibernateTemplate api 说:

...当在事务之外使用时,它能够回退到“自动提交”样式的行为

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate3/HibernateTemplate.html

谁能指出发生的地方:

https://github.com/

http://grepcode.com

我搜索了一个小时没有成功。我正在寻找何时在我的应用程序中创建事务的答案,因为我了解休眠要求为与 db 的每次交互打开一个事务,但我没有打开任何事务,我也没有使用 JTA,我仍然有读取操作工作美好的。

【问题讨论】:

    标签: java spring hibernate jpa transactions


    【解决方案1】:

    All database statements are executed within the context of a physical transaction,即使我们没有明确声明事务边界(BEGIN/COMMIT/ROLLBACK)。数据完整性由ACID properties of database transactions 强制执行。

    因此,如果您没有在逻辑事务(Spring 事务拦截器)的上下文中注册当前的工作单元,那么每个 DB 语句将在单独的数据库物理事务中执行,因此您将在“自动-commit”模式。

    ...它能够在以下情况下回退到“自动提交”样式行为 在交易之外使用

    这句话告诉你,你可以在 @Transactional 上下文中使用 TransactionTemplate,甚至在没有事务上下文的情况下也可以。所以你没有义务使用 Spring 事务分界,尽管for performance reasons you should do so

    因此,与 TransactionTemplate 相关的代码的工作方式与是否具有当前正在运行的事务上下文无关。

    如果您想在单个数据库事务中注册多个语句,则使用普通 JDBC 您的代码必须显式声明事务边界(开始/提交/回滚)。如果您不这样做,您将在“自动提交”模式下运行。

    【讨论】:

    • 那么“..以及回退到'自动提交'的能力。”方法?如果我们无论如何都可以毫不费力地实现这一目标,那么 api 文档是怎么说的? Spring 是否会对其进行处理以使其回落?
    • 所以你说我们根本没有义务从客户端代码打开交易。我的意思是我们应该,但如果我们不这样做,它不会抛出任何异常。我对休眠文档说“数据库或系统事务边界总是必要的”感到困惑。 http://docs.jboss.org我想尝试在spring之外使用hibernate,如果它可以正常工作,我会接受答案。
    • 当然可以。为什么你认为有一个 Hibernate 属性,例如 hibernate.connection.autocommit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2013-01-20
    • 2014-01-13
    相关资源
    最近更新 更多