默认情况下,Spring数据JPA或Hibernate的自动提交设置为false。这听起来很合理,因为这些框架与实体一起工作,并且对实体的更新可能涉及通过多个SQL查询对多个表的更新。因此,通过将auto-commit设置为false并显式控制事务,这些框架确保了对实体的更改是原子的和一致的。
但现在Hikari是spring data jpa的默认连接池提供程序,在查看应用程序日志时,我看到Hikari将连接池的自动提交设置为true。
2021-10-24 11:30:07.815 DEBUG [restartedMain] com.zaxxer.hikari.HikariConfig||HikariConfig.logConfiguration:1135: autoCommit................................true
解释为什么这样设置以及这样做是否会影响事务(我不认为它会影响事务,因为每个事务可能会再次将自动提交设置为假,从而接管何时提交事务。)
编辑 - 遵循@ken-chan的答案和讨论。
对于使用 spring 数据 jpa 和 @Transactional(具有 100% Hiberante)的项目,将 hikaris 连接池设置更改为 auto-commit=false
应该会带来性能优势。有关更多详细信息,请参阅答案和后续讨论。
我认为Hikari只是遵循JDBC定义的默认自动提交值(即true),以与其默认行为保持一致。(见此)
并且您的猜测是正确的,那么该框架将负责配置JDBC 连接
的必要的自动提交值,以便它可以在多个JDBC 语句
上执行事务处理。
例如,在使用JDBC的Spring@Transactionl
中,下面的代码显示,如果启用了自动提交,它将在执行任何事务代码之前禁用它。它还将在完成事务后重新启用它。
// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,
// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
if (con.getAutoCommit()) {
txObject.setMustRestoreAutoCommit(true);
if (logger.isDebugEnabled()) {
logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
}
con.setAutoCommit(false);
}
为什么它们没有被应用?
问题内容: 我一直想知道为什么JDBC API提供了自动提交模式()。似乎很吸引人的麻烦只是诱使人们陷入麻烦。我的理论是,仅将其添加到JDBC是为了简化希望创建使用JDBC编辑和运行SQL的工具的供应商的生活。是否有其他原因打开自动提交,还是总是错误? 问题答案: 不幸的是,使用自动提交是特定于数据库的(事务行为也是如此)。我认为,如果您没有全局的程序化交易策略,自动提交可能比仅希望每个人都正确关
我正在尝试关闭Hikari上多个数据源的自动提交,但我没有任何运气。我使用的是Spring Boot2(2.0.3.发行版)。以下是我的配置:
我使用JavaFX Scene Builder1.1创建了一个FXML文件。默认情况下创建AnchorPane。为什么我不能修改resizable属性?
我正在阅读https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/connectors/datastream/kafka/#kafka-消费者补偿提交行为配置 它说: 启用检查点:如果启用了检查点,Flink Kafka使用者将在检查点完成时提交存储在检查点状态中的偏移量。这确保了Kafka代理中提交的偏移量与检查点状态中