请参阅Spring DataSourceTransactionManager.java中的注释,函数doBegin:
// 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);
}
在我正在进行的项目中,未配置自动提交.所以默认情况下是这样.我们使用Spring来管理事务,所有sql都在@Transactional注释函数中执行.因此,事务是手动提交的.每次事务开始时,db连接都将autocommit设置为false,并在事务退出后将autocommit设置回true.典型的工作流程是(在JDBC级别):
> conn = dataSource.getConnection();
> conn.setAutoCommit(false);
> stmt = conn.createStatement();
> stmt.executeQuery(…);
> conn.commit()/ conn.rollback();
> conn.setAutoCommit(true);
设置autocommit来回昂贵吗?我们应该为性能原因配置数据源连接池autocommit = false吗?跳过第2步和第6步.
2)从绩效的角度来看,
a)如果你有很多用户,并且由于持有数据库锁而发生了一些冲突,
那么,可能需要检查与之相关的问题,但作为一般情况
规则,自动提交是为了简化初学者的东西而引入的.
b)可能存在需要回滚的情况.
c)您希望根据特定条件手动提交事务.
编辑:我看到你编辑了这个问题,简单回答你,autocommit = false会强迫你编写自己的提交/回滚/等,性能完全取决于数据库,实时锁定的数量!
编号将autocommit设置为false并再次为true将不会增加系统的收费.
不,不要配置数据源连接池autocommit = false,除非您出于某些特定原因并且是经验丰富的人员.从性能的角度来看,正如我已经十分认证的那样,它依赖于数据库的类型和实时用户访问实例的数据库,对于您的项目,99.99%的百分比您不需要将其设置为false.
将autocommit设置为true只会确保在每个语句之后调用commit.
我还看到你从数据源获得连接,在这种情况下,最好保留连接的默认设置,以便下次从池中获取连接时,工作流程不会有任何问题
希望这有帮助!!