Spring+hibernate+mysql事物不回滚的原因以及处理
最近项目突然出了点问题,然后发现用Service层下面的一个类的一个方法里的事务居然没有回滚。然后自己写了一个测试方法经过了N次测试都是不回滚。以下是测试方法的一部分:
@Transactional(propagation =Propagation.REQUIRED,rollbackFor=RuntimeException.class)
public String getOnLineNum(String securecrt){
History his=new History();
his.setItem("123");
//此处特意设置一个超出字段长度使其出错
Ludan lu=new Ludan();
lu.setRoomName("33333333333333333");
historyDao.save(his);
ludanDao.save(lu);
return "123";
}
以上代码经过许多次的测试都是会把history表存入记录,但是ludan报错存入不了,这样相当于事务并没有回滚。
如下是Spring的部分配置:
<!-- spring 事务管理 start-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> <!-- 声明使用注解式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
一。 如上就是问题,然后经过大范围的查阅以及搜索,最后总结了几点Spring事务不回滚的原因:
1.你自己捕获异常了,没有抛出去让Spring知道。
2.没有正确配置Spring中的事务。
3.Service层次问题,即一些逻辑问题。
4.MySQL不支持事务。
二。解决办法
这里重点讲解一下上线的第四种原因的解决办法,这也是本人项目中遇到的问题。即MYSQL默认的数据库模式是MyISAM,而这个模式是不支持事务的,并且在安装mysql的时候默认的数据库模式就是MyISAM。在mysql里输入:show engines;就会看到如下的画面:

可以看到只有InnoDB才支持事务。因此要实现mysql的事务必须先把mysql数据库模式转换成InnoDB。
具体方法如下:
1.打开根目录下得my.ini文件,在[mysqld]下加入:
default-storage-engine=INNODB
如果有skip-innodb,那就把这行注掉即可。
2.重启mysql服务
3.再次进入mysql,输入:show engines;就可以看到默认的数据库模式已经是INNODB了;
4.原来存在的表则需要删除以后再重新建一个就是INNODB的了,如果不想删除,那就进入mysql,更新一下表引擎就可以了
执行:alter table 表名 ENGINE=InnoDB;
然后在执行:show table status from 数据库名 where name='表名';就可以查看状态了
5.再次测试上面的代码就发现事务回滚了。
三。总结
对于这个自己遇到的问题可能是大部分人都遇到过的问题吧,也算是自己的经验不足造成的,因此记录下来方便一些像我一样走在程序的路上的朋友们,希望能对大家有一些帮助,也同时做一个自己的工作记录吧,以后也可以回来再次审查。
Spring+hibernate+mysql事物不回滚的原因以及处理的更多相关文章
- MySql事务无法回滚的原因
使用MySQL时.假设发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时.不要苦恼,先看看MySQL创建的表有没有问题.即表的类型. InnoDB和MyISAM是在使 ...
- spring 事物不回滚
使用spring控制事物,为什么有些情况事物,事物不回滚呢?? 默认spring事务只在发生未被捕获的 RuntimeException时才回滚. spring aop 异常捕获原理: 被拦截的 ...
- spring事物不回滚的问题
学习spring分布式事务的时候,自己整了个demo,写test测试的时候发先事物没有回滚.此问题和分布式事务没关系.1.在service层引入@Transaction注解 使用 throw new ...
- 哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚
一,为什么框架中根本没有对Exception的一般子类进行回滚配置,异常发生时,事务都进行了回滚 ,说好的只会对RuntimeException(Unchecked 非受检异常)回滚呢? 此时,我们就 ...
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- 【Java EE 学习 53】【Spring学习第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【问题:整合hibernate之后事务不能回滚】
一.Spring整合Hibernate 1.如果一个DAO 类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了:如果一个DAO类没有 ...
- Spring事物不回滚
今天发现个自己的bug,仔细排查后,发现根本原因我在service方法中抛出的异常被控制层的方法捕获了,所以后台页面也只是出现个错误提示,而数据却没有回滚. 解决方式:对自己抛出的异常使用try ca ...
- SpringBoot使用Junit测试 防止事物自动回滚
问题:我在测试类中的save方法测试成功通过,但数据库没有插入数据 测试方法如下: @Test @Transactional // @Rollback(false) public voi ...
- spring@Transactional注解事务不回滚不起作用无效的问题处理
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性先来了解一下@Transaction ...
随机推荐
- Cetus
转自:https://github.com/Lede-Inc/cetus Cetus 简介 Cetus是由C语言开发的关系型数据库MySQL的中间件,主要提供了一个全面的数据库访问代理功能.Cetus ...
- 中断一个telnet连接
假如我要telnet一个端口通不通,测试通过之后后出现黑屏的界面 这时候需要按下ctrl+] 组合键 然后输入 quit 即可退出telnet窗口,可以继续测试下一个端口~
- PostgreSQL误删操作怎么处理
方式一: PostgreSQL中没有Oracle的闪回机制,只有更加复杂的PITR恢复机制,这要求数据库有全量备份和增量备份,否则无法进行回滚. 方式二: 虽然PostgreSQL有延迟复制的技术,在 ...
- jquery日期和时间的插件精确到秒
首先.html5提供了input的time类型,使我们可以通过input框输入日期,但是如果我们的需求是这个时间需要明确到几时几分几秒的,那html5就没有办法满足我们的需求了,就需要使用jQuery ...
- Spring MVC - 拦截器实现 和 用户登陆例子
1.拦截器 SpringMvc中的拦截器实现了HandlerInterceptor接口,通常使用与身份认证,授权和校验,模板视图,统一处理等: public class HanderIntercept ...
- git log 退出方法
前言 使用git的过程中会有一些疑问,理当记录,方便自己随时查看,可能也会帮助他人解惑,甚好! 1.git log退出方法 使用git log之后无法回到主页面,如下图所示,最后只能暴力关闭git b ...
- HihoCoder - 1781: Another Bubble Sort (冒泡排序&逆序对)
Sample Input 3 9 8 7 5 1 9 2 6 4 3 1 2 3 4 5 6 7 8 9 9 8 7 5 1 9 2 6 4 3 1 2 5 4 3 6 7 8 9 9 8 7 5 1 ...
- 一致性哈希算法(Consistent Hashing Algorithm)
一致性哈希算法(Consistent Hashing Algorithm) 浅谈一致性Hash原理及应用 在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如 ...
- Visual Studio Code打造Markdown编辑器
1.准备工作: OS:Windows10 专业版或企业版 安装:Visua Studio Code,版本 1.23 (2018-5-3) 官网下载:https://github.com/Microso ...
- set 与 map 的第一次尝试
map 杭电6015http://acm.hdu.edu.cn/showproblem.php?pid=6015 基本用法:map<string,int>mp; mp[class[ i ...