Java 为什么是;hibernate.connection.autocommit=true";不建议在Hibernate中使用?

Java 为什么是;hibernate.connection.autocommit=true";不建议在Hibernate中使用?,java,database,hibernate,transactions,autocommit,Java,Database,Hibernate,Transactions,Autocommit,在HibernateAPI中,有一个属性可以设置为true 但在API中,他们提到不建议这样设置: 为JDBC池连接启用自动提交(不是 推荐) 为什么不推荐呢? 将此属性设置为true会产生什么不良影响?我的理解是,如果Hibernate自动提交,则部分失败的刷新将不会回滚。您将有一个不完整/损坏的对象图 如果您想为某些内容打开带有自动提交的连接,则始终可以打开新创建的会话以获取底层JDBC连接,setAutocommit(true),通过JDBC API执行工作,setAutocommit(f

在HibernateAPI中,有一个属性可以设置为true

但在API中,他们提到不建议这样设置:

为JDBC池连接启用自动提交(不是 推荐)

为什么不推荐呢?
将此属性设置为true会产生什么不良影响?

我的理解是,如果Hibernate自动提交,则部分失败的刷新将不会回滚。您将有一个不完整/损坏的对象图


如果您想为某些内容打开带有自动提交的连接,则始终可以打开新创建的
会话
以获取底层JDBC连接,
setAutocommit(true)
,通过JDBC API执行工作,
setAutocommit(false)
,然后关闭会话。我不建议在已完成任何操作的
会话上执行此操作。

默认情况下,autocommit值为false,因此需要显式提交事务。这可能是更改未反映在数据库中的原因,否则可以在提交之前尝试刷新以强制更改

当您关闭会话时,它将隐式地提交到数据库中[取决于实现]

当您有级联事务&需要回滚原子性时,您需要控制事务&在这种情况下,autocommit应该为false

将自动提交设置为true或显式处理事务

这是一个很好的解释

与此相关


所有数据库语句都在物理事务的上下文中执行,即使我们没有显式声明事务边界(BEGIN/COMMIT/ROLLBACK)

如果不声明事务边界,则每个语句都必须在单独的事务中执行。这甚至可能导致每个语句打开和关闭一个连接

将服务声明为@Transactional将在整个事务持续时间内为您提供一个连接,并且所有语句都将使用该单个隔离连接。这比一开始不使用显式事务要好得多。在大型应用程序上,您可能会有许多并发请求,降低数据库连接获取请求率无疑会提高您的整体应用程序性能

因此,经验法则是:

  • 如果只读事务只执行一个查询,则可以为这些事务启用自动提交

  • 如果事务包含多个语句,则需要禁用自动提交,因为您希望所有操作都在单个工作单元中执行,并且不希望对连接池施加额外压力


  • 不要使用每操作会话反模式:不要为单个线程中的每个简单数据库调用打开和关闭会话。数据库事务也是如此。应用程序中的数据库调用是使用计划序列进行的;它们被分成原子工作单元。这也意味着,在应用程序中,在每个SQL语句之后自动提交是无用的,因为此模式用于特别的SQL控制台工作。Hibernate立即禁用或期望应用程序服务器禁用自动提交模式。数据库事务从来都不是可选的。与数据库的所有通信都必须发生在事务内部。应该避免读取数据的自动提交行为,因为许多小型事务不可能比一个明确定义的工作单元执行得更好。后者也更易于维护和扩展


    hibernate在引擎盖下使用JDBC。autoCommit是JDBCConnection的一个概念,意思是“每个语句的事务”。transactionn=1 sql语句的作用域[autocommit=true]hibernate.connection.autocommit=true使每个语句在完成后提交,因此我们不能将两个或多个语句作为单个工作单元的一部分提交/回滚。我们需要-所有语句运行或无运行-为此,我们需要标记事务的开始和结束,并且需要禁用autoCommit.hibernate.connection.autoCommit=false 2个场景显式事务边界:sessionFactory.openSession()session.beginTransaction()session.getTransaction().commit()//刷新会话,提交Txn session.close()隐式事务边界sessionFactory.openSession()//看不到事务用法,//但其隐式Txn,因为-Autocommit是false session.flush()session.close()-当我们关闭会话时,规范不明确,因此Oracle中特定于供应商的行为-所有sql语句都在postgresql中提交-所有sql语句都回滚