在 Hibernate API 中,有一个属性 hibernate.connection.autocommit 可以设置为 true。
但是在API中,他们提到不建议这样设置:
为 JDBC 池连接启用自动提交(不推荐)。
为什么不推荐?将此属性设置为 true 有什么不良影响?
原文由 Ponmudi VN 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Hibernate API 中,有一个属性 hibernate.connection.autocommit 可以设置为 true。
但是在API中,他们提到不建议这样设置:
为 JDBC 池连接启用自动提交(不推荐)。
为什么不推荐?将此属性设置为 true 有什么不良影响?
原文由 Ponmudi VN 发布,翻译遵循 CC BY-SA 4.0 许可协议
默认情况下,autocommit 值为 false,因此需要显式提交事务。这可能是更改未反映在数据库中的原因,否则可以尝试刷新以在提交前强制更改。
当您关闭会话时,它将隐式地提交到数据库中[取决于实现]。
当您有级联事务并且需要回滚原子性时,您需要控制事务并且在这种情况下,自动提交应该是错误的。
将 autocommit 设置为 true 或显式处理事务。
这 是一个很好的解释。
与此相关的 Hibernate 论坛。
关于它的 Stackoverflow 问题。
原文由 user3145373 ツ 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
所有数据库语句都在物理事务的上下文中执行,即使我们没有明确声明事务边界(BEGIN/COMMIT/ROLLBACK)也是如此。
如果您不声明事务边界,则每个语句都必须在单独的事务中执行。这甚至可能导致每个语句打开和关闭一个连接。
将服务声明为 @Transactional 将为您提供整个事务期间的一个连接,并且所有语句都将使用该单个隔离连接。这比一开始不使用显式事务要好得多。在大型应用程序上,您可能有许多并发请求,降低数据库连接获取请求率肯定会提高您的整体应用程序性能。
所以经验法则是:
如果您有只执行一个查询的只读事务,您可以为它们启用自动提交。
如果您的事务包含多个语句,则需要禁用自动提交,因为您希望所有操作都在一个单一的工作单元中执行,并且不希望对连接池施加额外压力。