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

下面是笔者自己写的一个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 && dirtytrue,(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 && dirtyfalse,(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 && dirtytrue,(true || false)=true;

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

接着往下走rollback(true)

 

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

 

 

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

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

dirty这个值非常重要.


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值