Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数

下面是笔者自己写的一个getSqlSession的类

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第1张图片

重点在于SqlSession的获取:

1.oppenSession()打开源码我们发现

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第2张图片

oppenSession两个方法我们调用的是空参方法也就是说我们的autoCommit参数的值是false

我们接着往下跟踪

openSessionFromDataSource()方法

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第3张图片

我们从图中可以知道返回值是new 一个新的DefaultSqlSession对象并把autoCommit=false传入了这个对象的构造函数里

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第4张图片

*这里的dirty对接下来的分析非常重要

也就是说我们的新的SqlSession对象中 autoCommit=false    dirty=false

这是我们的测试单元

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第5张图片

测试单元里主要探究两个问题:

1.在进行数据库的增删改的时候,需要提交事务以及在底层的实现

2.如果数据库的增删改发生异常后直接执行close(),并不用执行rallback()回滚函数

我们先查看insert()方法在其底层是如何实现的

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第6张图片

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第7张图片

我们发现在MyBaties框架中底层关于数据库的增删改都是对数据库的改,即是Update()

我们来看看Update()

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第8张图片

从这里我们知道一旦我们的对象SqlSession进行了改的操作

dirty=true,autoCommit=false

接下来我们看下提交操作commit()

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第9张图片

IsCommitOrRollbackRequired()方法名是提交或者回滚?我们来看看这个函数

 

从上面可知我们的autoCommit=false   dirty=true   force=false

我们的返回值是!autoCommit && dirtytrue,(true || false)=ture;

也就是说我们的IsCommitOrRollbackRequired()方法的返回值是ture

即是executor.commit(ture);

我们跟下executor.commit()方法

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第10张图片

很清楚了我们传进去的true直接到if语句进行判断然后交给Mybatis框架的事务管理器进行

Commit()操作

由于我们提交了数据我们的autoCommit=false   dirty=false   

接下来我们分析一下如果数据库的增删改发生异常后直接执行close(),并不用执行rallback()回滚函数

回到测试单元往close()下跟

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第11张图片

从上图传进来的一个false

接着分析:

force=false

我们的返回值是!autoCommit && dirtyfalse,(false || false)=false;

即是executor.close(false);接着往下跟

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第12张图片

接着往下跟rollback(false)

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第13张图片

也很清楚了事务管理器不执行rollback()回滚方法

我们来分析第一个问题1.在进行数据库的增删改的时候,需要提交事务以及在底层的实现

我们回到测试单元不执行commit()方法来跟踪一下

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第14张图片

我们的测试执行insert()方法跟一下前文已经验证了insert()方法是通过Update()实现的我就直接看Update()方法

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第15张图片

注意这个时候我们的autoCommit=false    dirty=true

接下来程序执行的是close()方法我们再次往下跟

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第16张图片

我们发现还是这个IsCommitOrRollbackRequired()方法传进去的是false

我们分析下

autoCommit=false    dirty=true   force=false

我们的返回值是!autoCommit && dirtytrue,(true || false)=true;

即是executor.close(true);接着往下跟

Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第17张图片

接着往下走rollback(true)

 Mybatis底层对数据库的增删改的实现以及发生异常直接执行close(),并不执行rollback()回滚函数_第18张图片

传进来的是true值,事务管理器执行的是回滚方法

 

 

以上就是笔者有关MyBatis工具类的一点浅谈

总结:MyBatis框架下只要我们进行了commit()提交操作,close()方法就不会执行回滚rollback()操作,不进行commit()提交操作,close()方法就一定执行回滚rollback()操作,纵观全文

dirty这个值非常重要.


你可能感兴趣的:(Java框架)