mybatis连接事务源码分析
mybatis运行原理
使用单独的mybatis与集成spring使用方式是不同的。接下来先说单独使用mybatis的用法
InputStream inputStream = null;
inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
sqlSession =sqlSessionFactory.openSession();
courseDaoMapper = sqlSession.getMapper(CourseDaoMapper.class);
对比jdbc,应当了解mybatis什么时候获取连接的,什么时候进行事务管理的。
普通的jdbc管理事务代码如下
//默认连接是自动提交事务如果需要手动提交,只需要将sutocommit设为false即可
try{
con.setAutoCommit(false);//开启事务
......
con.commit();//try的最后提交事务
} catch() {
con.rollback();//回滚事务
}
试问:mybatis是在哪个步骤开启的连接,关闭的连接及提交的事务呢?
直接说答案:
//获取的sqlsessionfactory对象
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//追踪opensession这个方法里面会定义一些
sqlSession =sqlSessionFactory.openSession();
mybatis使用sqlsession–(实现类DefaulSqlSession)
如下图是sqlsessionFactory获取sqlsession的方法,会创建Transaction和Executor对象,并将该两个对象赋值给defaulsqlsession。
Transaction:看类描述是负责connection 的提交 关闭、获取连接的作用
Executor:翻译是执行者,负责进行执行。
再次进入defaulSqlsession对象
所有sqlsession的增删改操作都是调用的update方法。
在此进入executor的update方法
在此时从DataSource中获取连接的。也就是在调用sqlsession.增删改查的时候才从DataSource中获取连接。
事务什么时候提交?
如果在获取sqlssion的时候, sqlSession =sqlSessionFactory.openSession();这种默认是不自动提交,如果参数为true,那么获取的连接都会是自动提交。也就不需要关心事务了。
因此在mybatis中研究事务,只能是opensession的时候设置默认不自动提交或者设为false。
如果设为不自动提交,那么事务什么时候进行提交?
答案是:当调用sqlsession.commit()的方法的时候。
当不太调用sqlsession.commit()的时候,直接sqlsession.close(),那么 如果会进行回滚操作。因此当不是自动事务的时候,无比需要手动进行提交,否则事务将会回滚。
是否发生变化,mybatis如何知道,是通过内置的一个dirty变量,当获取sqlsession的时候,会默认设置为false,当进行了增删改操作时候,会将该值设为true。当进行close的时候,会根据这个值来判断是否进行回滚操作。close之后,会将该值重新设为false。
记住mybatis机制即可。