我们通过SqlSessionFactory.openSession()方法创建出SqlSession对象时,自动提交事务默认是关闭的,即每次用SqlSession对象执行sql操作时必须显式commit()否则操作无效.源码如下:
public SqlSession openSession() {
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}
从源码可以看出boolean autoCommit=false.因此在使用SqlSession对象调用相应的方法去执行sql语句时必须要手动调用commit()方法提交事务修改操作才会生效.
但是如果通过mapper动态代理的方式获取DAO对象后去执行sql语句就不需要执行commit()方法来提交事务,这是为什么呢?我们来看一下源码:
1.获取mapper动态代理对象
public <T> T getMapper(Class<T> type) {
return this.configuration.getMapper(type, this);
}
此时,在真正执行sql的时候会通过MapperMethod对象调用execute(SqlSession sqlSession, Object[] args)方法,源码如下:
public Object execute(SqlSession sqlSession, Object[] args) {
Object param;
Object result;
switch(this.command.getType()) {
case INSERT:
param = this.method.convertArgsToSqlCommandParam(args);
result = this.rowCountResult(sqlSession.insert(this.command.getName(), param));
break;
case UPDATE:
param = this.method.convertArgsToSqlCommandParam(args);
result = this.rowCountResult(sqlSession.update(this.command.getName(), param));
break;
case DELETE:
param = this.method.convertArgsToSqlCommandParam(args);
result = this.rowCountResult(sqlSession.delete(this.command.getName(), param));
break;