博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSM-MyBatis-08:Mybatis中SqlSession的commit方法为什么会造成事物的提交
阅读量:6824 次
发布时间:2019-06-26

本文共 1806 字,大约阅读时间需要 6 分钟。

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

如题目所示,本小章节讨论为什么SqlSession的commit会造成事物的提交

首先先看SqlSession的commit()他是一个接口的方法,所以去他的实现类找(Ctrl+H)DefaultSqlSession类中查找他的commit无参数的方法,因为我们调用的也是他的无参方法,往下看

 

public void commit() {        this.commit(false);    }    public void commit(boolean force) {        try {            this.executor.commit(this.isCommitOrRollbackRequired(force));            this.dirty = false;        } catch (Exception var6) {            throw ExceptionFactory.wrapException("Error committing transaction.  Cause: " + var6, var6);        } finally {            ErrorContext.instance().reset();        }    }

 

看出来了吗?他调用了他下面的一个有参数的方法,并且传进去了参数,我们稍做记录,force是false

dirty变成false在执行器的提交下面,说明数据不是脏的了

executor.commit(XXX)执行器的提交,我们看里面的那个方法,commit在方法参数里面调用了方法并拿到返回值,看一下那个里面的方法,注意传进去的值为false

 

private boolean isCommitOrRollbackRequired(boolean force) {        return !this.autoCommit && this.dirty || force;    }

 

这个方法说实话,一眼看上去有点懵,但是你知道      !        &&        ||     的使用优先级,你就可以计算出来了      &&>||>!                    结果return回去的是true

上面的this.dirty是在上回说到的增删改都会底层调用update方法,里面改为true的

上面的autoCommit则创建sqlSession的时候就早早的改为false,OpenSession方法底层

接下来看上面的上面的executor.commit(XXX)方法,,他是Executor执行器接口的,找他的实现类BaseExecutor类的commit的带boolean参数的方法

 

public void commit(boolean required) throws SQLException {        if(this.closed) {            throw new ExecutorException("Cannot commit, transaction is already closed");        } else {            this.clearLocalCache();            this.flushStatements();            if(required) {                this.transaction.commit();            }        }   }

 

里面有一些不需要关注,不过简单提一嘴,clearLocalCache()清理缓存,flushStatements刷新参数

最终级的关注点就是因为if中的required是传进来的参数,上面已经解释过是true,所以他执行下一行代码就是transaction.commit(),哦,transaction的英文名就叫做事物

终结一句话:session.commit()最终调度到了事物的提交 ,this.transaction.commit()

 

转载于:https://www.cnblogs.com/DawnCHENXI/p/8467392.html

你可能感兴趣的文章
在Eclipse中使用XDebug调试代码 | Using XDebug debug code in eclipse
查看>>
[译] box-shadow 属性
查看>>
使用vue.js开发时的一些坑
查看>>
beego的ORM-配置数据库
查看>>
学习promise编写和使用
查看>>
PHP 打印函数之 print print_r
查看>>
固定头部的表格
查看>>
Decode Ways leetcode
查看>>
try-catch-finally中的return
查看>>
yii2 常用方法记录
查看>>
可想造一个属于你自己的jQuery库?(二)
查看>>
使用Coverage分析WSGI项目的代码覆盖率
查看>>
Linux 用户被差别对待?无法通过 apple.com 管理 Apple ID
查看>>
spring JdbcTemplate 在项目中的浅层(5个使用场景)封装 ...
查看>>
Kafka科普系列 | 轻松理解Kafka中的延时操作
查看>>
Python零基础学习笔记(二十九)—— OS模块
查看>>
MySQL8.0 - 新特性 - 通过SQL管理UNDO TABLESPACE
查看>>
函数计算实现 oss 上传超大 zip 压缩文件的自动解压处理 ...
查看>>
linux+xampp搭建WordPress个人网站过程详解
查看>>
JavaScript函数_函数作用域
查看>>