Spring Data JPA或Hibernate默认自动提交设置为false。这听起来很合理,因为这些框架与实体一起工作,对实体的更新可能涉及通过多个SQL查询对多个表的更新。因此,通过将自动提交设置为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
任何关于为什么要这样设置的解释,以及它是否会影响事务(我不认为它会影响事务,因为每个事务都可能再次将auto-commit设置为false,从而接管提交事务的时间)
编辑-关注@ken-chan的回答和讨论。
对于使用带有@Transactional (100% hibernate)的spring数据jpa的项目,将hikaris连接池设置更改为auto-commit=false
应该会获得性能优势。
我认为Hikari只是遵循JDBC定义的默认自动提交值(即true),以便与其默认行为保持一致。
您的猜测是正确的,框架将注意配置JDBCConnection
的必要的自动提交值,以便它可以在多个JDBCStatement
上执行事务。
例如,在使用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);
}