大家都说mybatis会自动回滚事务(如果增删改没有提交事务的话,不会写入到数据库中),为什么我没有?

瘦欲@ 提交于 2020-08-17 12:38:46

问题

今天复习一下mybatis,看到别人说事务自己也去了解一下

他们都说mybatis增删改需要手动提交事务
???
我看了一下自己的代码?我没有写提交啊?但是我的测试结果?和数据库查看结果都是成功的?有写入到数据库啊!!!
那为什么到我这里不需要提交事务?好奇的我想要去了解


猜想1

既然数据库需要手动提交事务,那肯定有自动提交事务
难道是我在这里被设置为自动提交事务了?

马上查看代码

  private static SqlSessionFactory sqlSessionFactory;
    static {
        try{
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch(Exception e){
           e.printStackTrace();
        }
    }


    public static SqlSession getSqlSEssion(){

        return sqlSessionFactory.openSession();
    }


查看源码,openSession() 不加true的话就是默认吧autocommit设置为false
那没问题啊!
查看日志:日志也说明了自动提交事务是没有开的
在这里插入图片描述
此猜想错了



猜想2

mybatis需要提交事务的原因是:

  • 它在创建sqlsession的时候会手动开启事务
  • 并在结束后自动回滚事务

所以,如果你不提交事务,那么增删改的操作都是无效的

难道是在这里出现了问题,但是在日志中也说明,jdbc的事务代码是有自动回滚的

在这里插入图片描述
其实答案已经很接近了,问题确实是出现在这个步骤,但是并不是出现在代码中,而是出现在数据库上

原因

  • 根本原因是出现在开启事务上
  • 它根本没有开启事务
  • 应该说他不能开启事务
  • 因为数据库使用的是myisam引擎,因为它不支持事务,所以根本就没有开启事务这个功能

引擎

mysql有几种引擎
在这里插入图片描述

  • InnoDB 支持事务、行级锁,
  • MyISAM都不支持
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!