【发布时间】:2016-04-04 06:29:59
【问题描述】:
请看spring DataSourceTransactionManager.java中的cmets,函数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 注解的函数中执行。所以事务实际上是手动提交的。每次事务开始时,数据库连接都设置为 false,事务退出后自动提交设置回 true。一个典型的工作流程是(在 JDBC 级别):
- conn = dataSource.getConnection();
- conn.setAutoCommit(假);
- stmt = conn.createStatement();
- stmt.executeQuery(...);
- conn.commit()/conn.rollback();
- conn.setAutoCommit(true);
来回设置自动提交是否昂贵?出于性能原因,我们应该配置数据源连接池 autocommit=false 吗?跳过第 2 步和第 6 步。
【问题讨论】:
标签: java mysql oracle transactions datasource