MySql事务无法回滚的原因
使用MySQL时。假设发现事务无法回滚,但Hibernate、Spring、JDBC等配置又没有明显问题时。不要苦恼,先看看MySQL创建的表有没有问题。即表的类型。
InnoDB和MyISAM是在使用MySQL最经常使用的两个表类型,各有优缺点,视详细应用而定。
主要的区别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其运行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
MyIASM是IASM表的新版本号,有例如以下扩展:
二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键吗统计分布。
更好和更快的auto_increment处理。
下面是一些细节和详细实现的区别:
1. InnoDB不支持FULLTEXT类型的索引。
2. InnoDB中不保存表的详细行数。也就是说,运行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。可是MyISAM仅仅要简单的读出保存好的行数就可以。注意的是,当count(*)语句包括where条件时,两种表的操作是一样的。
3. 对于AUTO_INCREMENT类型的字段。InnoDB中必须包括仅仅有该字段的索引,可是在MyISAM表中,能够和其它字段一起建立联合索引。
4. DELETE FROM table时,InnoDB不会又一次建立表。而是一行一行的删除。
5. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的。解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,可是对于使用的额外的InnoDB特性(比如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,假设在运行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表相同会锁全表,比如update table set num=1 where name like “%aaa%”
不论什么一种表都不是万能的,仅仅用恰当的针对业务类型来选择合适的表类型,才干最大的发挥MySQL的性能优势。
在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能区别并非非常大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,假设设置为1的话,那么每次插入数据的时候都会自己主动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率可以看到明显提升,当然。相同你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外。还听说通过设置innodb_buffer_pool_size可以提升InnoDB的性能,可是我測试发现没有特别明显的提升。
基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了。由于InnoDB自身非常多良好的特点,比方事务支持、存储过程、视图、行级锁定等等,在并发非常多的情况下。相信InnoDB的表现肯定要比MyISAM强非常多。当然,对应的在my.cnf中的配置也是比較关键的。良好的配置,可以有效的加速你的应用。
MySql事务无法回滚的原因的更多相关文章
- Spring+hibernate+mysql事物不回滚的原因以及处理
最近项目突然出了点问题,然后发现用Service层下面的一个类的一个方法里的事务居然没有回滚.然后自己写了一个测试方法经过了N次测试都是不回滚.以下是测试方法的一部分: @Transactional( ...
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- spring + mybatis 注解式事务不回滚的原因分析 @Transactional
在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...
- MySQL事务部分回滚-回滚到指定保存点
我们可以在mysql事务处理过程中定义保存点(SAVEPOINT),然后回滚到指定的保存点前的状态. 定义保存点,以及回滚到指定保存点前状态的语法如下. 定义保存点---SAVEPOINT 保存点名; ...
- Java事务不回滚的原因总结
1.首先要检查数据的引擎,InnoDB支持事务,MyIsam不支持事务 2. 默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚. spring aop 异常 ...
- SSM框架中,事务无法回滚的原因和解决
原因: 由ServletContextListener加载spring配置文件产生的是父容器,springMVC产生的是子容器,子容器对Controller进行扫描装配时装配了@Service注解的实 ...
- Spring事务不回滚原因分析
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离. 在我完成一个项目的时候,遇到了一个Spring事务不回滚的问题,通过aspectJ和@Transacti ...
- Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因
1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...
- spring@Transactional注解事务不回滚不起作用无效的问题处理
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性先来了解一下@Transaction ...
随机推荐
- [原创]C语言里为何会有“2+2=5”的结果
原文链接:C语言里为何会有“2+2=5”的结果 写这篇原创文章是因为看到了极客中的一篇文章<有趣各种编程语言实现2+2=5>,其中C语言是这样实现的: int main() { ″; // ...
- 初识Sencha Touch:面板Panel
HTML代码: <!doctype html> <html> <head> <meta charset="utf-8"> <t ...
- c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象
c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...
- CSS3 Test
CSS3Test 如何判定一个浏览器对css3的支持情况呢 有这么一个站点http://css3test.com 可以测试浏览器对CSS3的支持情况 对应的Github在这里 原理 实际上浏览器对CS ...
- S3C6410嵌入式应用平台构建(二)
[2014-4/11~4/14]经过之前的实验,对Uboot已经有了大体的了解,前我们已经把led灯给点亮,但这不是我们的根本目的,我们是要进入boot启动,经过两天的分析代码和反复的实验,终于可以进 ...
- cocos2d-x创建场景
今天开始学习Cocos2d-x,使用的版本是2.1.4,这个版本比较老,对应的参考资料也比较齐全. 在mac/xcode环境下,代码是写在Classes文件夹下的,和iOS应用类似,程序从AppDel ...
- Mahout源码MeanShiftCanopyDriver分析之二MeanShiftCanopyMapper仿造
首先更正一点,昨天处理数据的时候是有问题的,直接从网页中拷贝的文件的空格是有问题的,直接拷贝然后新建的文件中的空格可能有一个两个.三个的,所以要把两个或者三个的都换为一个,在InputMapper中下 ...
- STL 源代码剖析 算法 stl_algo.h -- merge sort
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie merge sort ----------------------------------- ...
- UVa 10491 Cows and Cars (概率&广义三门问题 )
10491 - Cows and Cars Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onli ...
- 自学xml的几个例子
xml是一种被用来传输和存储数据的语言,下面给出一些学习xml过程一些简单的例子.具体xml语法请转:http://www.w3school.com.cn/xml/xml_intro.asp 例子1: ...