下面是笔者自己写的一个getSqlSession的类
重点在于SqlSession的获取:
1.oppenSession()打开源码我们发现
oppenSession两个方法我们调用的是空参方法也就是说我们的autoCommit参数的值是false的
我们接着往下跟踪
openSessionFromDataSource()方法
我们从图中可以知道返回值是new 一个新的DefaultSqlSession对象并把autoCommit=false传入了这个对象的构造函数里
*这里的dirty对接下来的分析非常重要
也就是说我们的新的SqlSession对象中 autoCommit=false dirty=false
这是我们的测试单元
测试单元里主要探究两个问题:
1.在进行数据库的增删改的时候,需要提交事务以及在底层的实现
2.如果数据库的增删改发生异常后直接执行close(),并不用执行rallback()回滚函数
我们先查看insert()方法在其底层是如何实现的
我们发现在MyBaties框架中底层关于数据库的增删改都是对数据库的改,即是Update()
我们来看看Update()
从这里我们知道一旦我们的对象SqlSession进行了改的操作
dirty=true,autoCommit=false
接下来我们看下提交操作commit()
IsCommitOrRollbackRequired()方法名是提交或者回滚?我们来看看这个函数
从上面可知我们的autoCommit=false dirty=true force=false
我们的返回值是!autoCommit && dirty为true,(true || false)=ture;
也就是说我们的IsCommitOrRollbackRequired()方法的返回值是ture
即是executor.commit(ture);
我们跟下executor.commit()方法
很清楚了我们传进去的true直接到if语句进行判断然后交给Mybatis框架的事务管理器进行
Commit()操作
由于我们提交了数据我们的autoCommit=false dirty=false
接下来我们分析一下如果数据库的增删改发生异常后直接执行close(),并不用执行rallback()回滚函数
回到测试单元往close()下跟
从上图传进来的一个false值
接着分析:
force=false
我们的返回值是!autoCommit && dirty为false,(false || false)=false;
即是executor.close(false);接着往下跟
接着往下跟rollback(false)
也很清楚了事务管理器不执行rollback()回滚方法
我们来分析第一个问题1.在进行数据库的增删改的时候,需要提交事务以及在底层的实现
我们回到测试单元不执行commit()方法来跟踪一下
我们的测试执行insert()方法跟一下前文已经验证了insert()方法是通过Update()实现的我就直接看Update()方法
注意这个时候我们的autoCommit=false dirty=true
接下来程序执行的是close()方法我们再次往下跟
我们发现还是这个IsCommitOrRollbackRequired()方法传进去的是false
我们分析下
autoCommit=false dirty=true force=false
我们的返回值是!autoCommit && dirty为true,(true || false)=true;
即是executor.close(true);接着往下跟
接着往下走rollback(true)
传进来的是true值,事务管理器执行的是回滚方法
以上就是笔者有关MyBatis工具类的一点浅谈
总结:在MyBatis框架下只要我们进行了commit()提交操作,close()方法就不会执行回滚rollback()操作,不进行commit()提交操作,close()方法就一定执行回滚rollback()操作,纵观全文
dirty这个值非常重要.