问题
On my actual application, I have a DBCP connection pool which doesn't have JDBC autoCommit=false set. It seems to have the default autoCommit=true. This is probably a mistake but I'd like to understand the impact of changing this parameter.
I am using: - Spring with @Transactional annotation - Spring Batch with JDBC readers and writers, eventually custom tasklets using JdbcTemplate
I would like to know if Spring does set autoCommit=false on the current connection if it is in the context of a transaction handled by the TransactionManager. Does it override the default setting? Because it seems to me it makes sense to do so.
回答1:
PlatformTransactionManager is an interface, so I would not blanket say that all implementations set AutoCommit = false, however the most common implementation (DataSourceTransactionManager) does set AutoCommit = false. see code snippet below from the doBegin method:
if (con.getAutoCommit()) {
txObject.setMustRestoreAutoCommit(true);
if (logger.isDebugEnabled()) {
logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
}
con.setAutoCommit(false);
}
txObject.getConnectionHolder().setTransactionActive(true);
Now as you stated, it makes perfect sense to do so or you would not have a rollback segment to activate a rollback on.
来源:https://stackoverflow.com/questions/16301315/spring-transactional-and-jdbc-autocommit