赞
踩
可能大家会遇到有时对数据的 cuid操作不需要进行提交就能成功执行,有时候需要进行提交。这样不可控的行为是我们所不能接
受的。那么下面将会描述问题、介绍问题的产生并解决问题。
junit测试类中的写了一个方法用来测试:
- SqlSession session;
- Mapper dao;
-
- @Before
- public void setUp() throws Exception {
- String resource = "mybatis-config.xml";
- InputStream is = Resources.getResourceAsStream(resource);
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
- session = sqlSessionFactory.openSession();
- dao = session.getMapper(Mapper.class);
- }
- /**测试方法,调用接口中的方法,执行Mapper.xml中的Sql,并进行session.commit()
- */
- @Test
- public void updateUser(){
-
-
- }
这里就有问题了,如果不进行commit,代码测试也正常通过。就像在测试方法中只声明了类,却没去调用去实现的方法。成功但没结果。这个时候数据并没有插入到数据库中。例如做了修改,调试成功但是数据库信息并未修改。
现实生活中许多情形都是需要进行事务管理的,最经典的就是转账,钱转出去,由于特殊原因导致服务器宕机。另外一边没有接收到
钱。这样的事情是不被允许的。
接下来对描述问题的解决思路,希望对大家有用。
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表示禁用。
(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表进行的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。