当前位置:Gxlcms > 数据库问题 > SSM-MyBatis-09:Mybatis中SqlSession的close为什么能造成事务的回滚

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

时间:2021-07-01 10:21:17 帮助过:34人阅读

 

 

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

同样找到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在底层调用了事务的回滚的方法,当然会造成事务的回滚啊~~~~~~

 

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

标签:cer   except   strong   UI   ack   flush   读者   param   put   

人气教程排行