为什么不建议在Hibernate中使用“hibernate.connection.autocommit = true”?

在Hibernate API中,有一个属性hibernate.connection.autocommit可以设置为true。

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

为 JDBC 池连接启用自动提交(不建议这样做)。

为什么不推荐?将此属性设置为 true 有什么不良影响?


答案 1

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

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

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

所以经验法则是:

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

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


答案 2

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

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

当你有级联事务并且需要回滚原子性时,你需要控制事务,在这种情况下,自动提交应该是假的。

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

这里有一个很好的解释。

与此相关的休眠论坛

堆栈溢出问题就好了。


推荐