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机制即可。

猜你喜欢

转载自blog.csdn.net/qq_32281025/article/details/85125946