mybatis SqlSession事务

本文介绍了MyBatis框架中默认的SqlSessionFactory实现——DefaultSqlSessionFactory的openSession方法的工作原理。该方法每次获取SqlSession时都会开启一个新的事务,并默认设置为不自动提交。文章通过示例代码展示了如何插入一条记录并手动提交事务以避免在连接关闭时发生回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();}
        }

 

转载于:https://www.cnblogs.com/suchunping/p/10629832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值