当前位置:   article > 正文

Mybatis的JDBC提交设置/关闭mysql自动提交_关闭mybatis自动提交

关闭mybatis自动提交

                                  Mybatis的JDBC提交设置/关闭mysql自动提交

 

     可能大家会遇到有时对数据的 cuid操作不需要进行提交就能成功执行,有时候需要进行提交。这样不可控的行为是我们所不能接

受的。那么下面将会描述问题、介绍问题的产生并解决问题。

 

1 问题描述

 

    junit测试类中的写了一个方法用来测试:

  1. SqlSession session;
  2. Mapper dao;
  3. @Before
  4. public void setUp() throws Exception {
  5. String resource = "mybatis-config.xml";
  6. InputStream is = Resources.getResourceAsStream(resource);
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  8. session = sqlSessionFactory.openSession();
  9. dao = session.getMapper(Mapper.class);
  10. }
  11. /**测试方法,调用接口中的方法,执行Mapper.xml中的Sql,并进行session.commit()
  12. */
  13. @Test
  14. public void updateUser(){
  15. }

 

    这里就有问题了,如果不进行commit,代码测试也正常通过。就像在测试方法中只声明了类,却没去调用去实现的方法。成功但没结果。这个时候数据并没有插入到数据库中。例如做了修改,调试成功但是数据库信息并未修改。

 


2 现实问题
  

     现实生活中许多情形都是需要进行事务管理的,最经典的就是转账,钱转出去,由于特殊原因导致服务器宕机。另外一边没有接收到

钱。这样的事情是不被允许的。

 

3 解决办法
 

    接下来对描述问题的解决思路,希望对大家有用。

    1.首先需要在openSession()方法中传入参数;false为关闭自动提交,true为开启自动提交。默认的是false

   SqlSession session = sessionFactory.openSession(true);//自动提交

     2.修改你自己的mybatis-config.xml 文件和jdbc.properties文件。具体修改如下所示:

    <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <property name="defaultAutoCommit" value="${defaultAutoCommit}"/>
      </dataSource>
    </environment>

      需要在mybatis-config.xml 文件加入这么一行代码,需要在jdbc.properties文件中加入defaultAutoCommit=false

与上面的参数相同,true开启,false关闭。

    3.如果代码没什么问题,那么就需要去看数据库了。mysql数据库本身默认引擎是默认自动提交的。但也有引擎格式是必须commit的。

    注:这里需要看数据库和数据表是否是InnoDBy引擎 只有InnoDB类型的表才可以设置autocommit;(后面设置和查看autocommit的sql语句)

输入  show variables like '%storage_engine%';来对数据库的引擎格式进行查看。

    右击表->点击设计表->选项,查看表引擎是否是InnoDB

 

      设计完成后基本就完成了自动提交的设置。总结如下:查看数据库表引擎是否为InnorDB->添加整体连接配置(配置

mybatis-config.xml和jdbc.properties)->设置局部Sqlsession对象:为SqlSessionFactory工厂对象的optionSession()方法传参。

根据传递参数进行限制。

    注意:局部优先于整体。也就是说整体配置自动提交为false后,如果局部配置为true则当前所有操作会自动进行提交。

第二种方式也就是代码限制:

禁用步骤:

    1、在执行inser / update / delete之前 先执行一个begin;语句,进行了一段时间的数据库操作之后使用commit提交所有操作或者使

  用rollback回滚所有操作

    2. 方法调用中首先开启事务,从而对事务进行管理

   3.登录mysql数据库设置是否关闭自动提交;sql 代码 set autocommit='off''(on),并进行查看 show variables like "autocommit"; 如果

为OFF表示禁用。

 

4 补充MySQL引擎

(1) MyISAM存储引擎
      不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创

建表。支持3种不同的存储格式,分别是:静态表;动态表;压缩表。

       静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。

      动态表:记录不是固定长度。缺点是如果进行频繁的更新、删除数据,那么容易产生碎片,需要定期执行OPTIMIZE TABLE或者 myisamchk-r命令来改善性能;优点是占用的空间相对较少;

      压缩表:每条记录都是被单独压缩的,所以只有非常小的访问开支

(2) InnoDB存储引擎*

      该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
InnoDB存储引擎的特点:支持自动增长列,支持外键约束

(3) MEMORY存储引擎
      Memory存储引擎使用存在于内存中的内容来创建表。主要用于内容变化不频繁的数据表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果。MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围。这种引擎下对表进行更新操作要谨慎,因为每个memory表只实际对应一个格式是.frm磁盘文件,数据是放在内存中的,并没有实际写入到磁盘中。一旦服务关闭,表中的数据就会丢失掉。优点也很突出:由于数据存储在内存中,所以对表的访问非常快,并且memory引擎下默认使用HASH索引。

Hash索引优点:

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页

点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;

(4) MERGE存储引擎

      Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。


   

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/173609
推荐阅读
相关标签
  

闽ICP备14008679号