SSM-MyBatis-09:Mybatis中SqlSession的close为什么能造成事务的回滚

 

 

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

 

 

经过上几次的查找,笔者我就简单的说一下查找的思路,留给读者自己实践

同样找到sqlsession的实现类,----DefaltSqlSession,找它的close方法

 

public void close() {
        try {
            this.executor.close(this.isCommitOrRollbackRequired(false));
            this.closeCursors();
            this.dirty = false;
        } finally {
            ErrorContext.instance().reset();
        }

    }

 

executor执行器的close方法里面的这个方法,传入false

 

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

 

根据上一篇博客写的,他们三个逻辑运算符的优先级  &&>||>!

得到值为true

看executor.close(boolean XXX)的方法,同样找他实现类BaseExecutor

 

public void close(boolean forceRollback) {
        try {
            try {
                this.rollback(forceRollback);
            } finally {
                if(this.transaction != null) {
                    this.transaction.close();
                }

            }
        } catch (SQLException var11) {
            log.warn("Unexpected exception on closing transaction.  Cause: " + var11);
        } finally {
            this.transaction = null;
            this.deferredLoads = null;
            this.localCache = null;
            this.localOutputParameterCache = null;
            this.closed = true;
        }

    }

 

从头开始看,rollback(true)这一行

 

 

 

 

public void rollback(boolean required) throws SQLException {
        if(!this.closed) {
            try {
                this.clearLocalCache();
                this.flushStatements(true);
            } finally {
                if(required) {
                    this.transaction.rollback();
                }

            }
        }

    }

 

finally中是什么事物的回滚啊,这就真相大白

SqlSession中的close在底层调用了事务的回滚的方法,当然会造成事务的回滚啊~~~~~~

 

posted @ 2018-02-24 19:30  晨曦Dawn  阅读(550)  评论(0编辑  收藏  举报