mybatis SqlSession事務


mybatis版本:3.4.6。

mybatis默認的SqlSessionFactory是DefaultSqlSessionFactory,它openSession()的源碼是:

    public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }
    private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;
        try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            Executor executor = this.configuration.newExecutor(tx, execType);
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
            this.closeTransaction(tx);
            throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }

        return var8;
    }

可以看到,mybatis默認每次獲取session都會開啟一個事務,且不自動提交事務。如果更新操作完成后不手動commit,則在連接斷開時會將更新操作回滾。

        SqlSession session = MybatisUtil.getSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        try{
            UserDomain newUserDomain = new UserDomain();
            newUserDomain.setAge(10);
            newUserDomain.setName("scp2");
            newUserDomain.setSchool("高中");
            userMapper.insert(newUserDomain);
            session.commit();// 如果不commit,連接斷開時操作會被回滾
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {
            if (null != session) {session.close();}
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM