源码分析
输入流的关闭
在输入流对象使用完毕后,不用手工进行流的关闭。因为在输入流被使完毕后,SqlSessionFactoryBuilder对象的build()方法会自动将输入流关闭。
![]()
![]()
SqlSession的创建
SqlSession对象的创建,需要使用SqlSessionFactory接口对象的openSession()方法。SqlSessionFactory接口的实现类为DefaultSqlSessionFactory。
![]()
打开openSession()方法的源码:
![]()
从以上源码可以看到,无参的openSession()方法,将事务的自动提交直接赋值为false。而所谓创建SqlSession,就是加载了主配置文件,创建了一个执行器对象(将来用于执行映射文件中的SQL语句),初始化了一个DB数据被修改的标志变量dirty,关闭了事务的自动提交功能。
增删改的执行
对于SqlSession的insert()、delete()、update()方法,其底层均是调用执行了update()方法。
![]()
![]()
![]()
从以上源码可以知道,无论执行增、删还是改,均是对数据进行修改,均将dirty变量设置为了true,并且在获取到映射文件中指定的id的SQL语句后,由执行器executor执行。
SqlSession的提交commit()
![]()
由以上的代码可以知道,isCommitOrRollbackRequired(force)方法的返回值为true。继续跟踪executor的commit()方法:
![]()
![]()
由以上的代码可以知道,执行SqlSession的无参commit()方法,最终会将事务进行提交。
SqlSession的关闭
![]()
![]()
由以上的代码可以知道,isCommitOrRollbackRequired(force)方法的返回值为true。继续跟踪executor的close()方法:
![]()
再跟踪Executor接口的BaseExecutor抽象类的close()方法:
![]()
![]()
从以上代码分析可以知道,在SqlSession进行关闭时,会将事务回滚后关闭。所以,对于MyBatis程序,无需通过显示的对SqlSession进行回滚来达到事务回滚的目的。
网友评论