在Service中抛出异常事务未回滚问题分析与解决
1.问题提出:
在service中写方法时,抛出了一个Exception, 本来目的是为了让事务回滚, 但事实上没有回滚,产生了脏数据。
代码如下:
@Override
@Transactional
public void insertInSingle(String type, MobileEditInDTO dto) throws Exception {
MaterialOtherInSingle otherInSingle = otherInService.findEntityByProperty("tableNo", tableNo);
//其他入库单表头
otherInSingle.setServiceTypeID(serviceTypeService.getServiceType(dto.getServiceTypeId()));
otherInSingle.setInCome(storageTypeService.getStorageType(dto.getStorageTypeId()));
otherInSingle.setInStorageDate(dto.getInDate());
throw new Exception(111);
}
在这个方法中用hql获得了一个持久态对象,并设置了新的属性,在最后演示的时候抛出了异常,但是最后并未回滚。
2.问题分析
在这个方法中加入了@Transactional注解,声明了这是一个事务,其原理就是AOP。平时我们都是这么做的,但是并不是很清楚原理是什么。
注解其实只是一个声明,真正的目的在声明之后这个方法成为了一个连接点,说到连接点又不得不说AOP,
AOP说简单点其实就是一个动态代理,我们service之所以要先声明接口再有一个实现类其实很大程度上为了实现动态代理,实现动态代理之后我们可以省去很多在方法层面上重复的代码。
不理解的请自行百度关键词: AOP, 动态代理,这个东西很复杂一下子也说不清楚(其实我也不是很懂)。
说回来这个@Transactional,它的切入点(PointCut)其实就是抛异常,在抛出异常的时候调用增强处理(Advice)中的方法将事务回滚掉,但是这个抛异常抛的不是普通的自Exception中继承过来的异常,
unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚。虽然RuntimeException继承自Exception,但是切入点要更具体一些。
当然如果要让所有Exception都回滚,在@Transactional(rollbackFor = Exception.class) 上加个参数就好了。
但是要注意的事,如果声明了@Transactional,但是又在方法里面自己捕获了异常,也就是try catch掉了,那就不会回滚了,因为切入点根本没捕获到,也谈不上调用增强处理中的方法了。
3.问题解决
上面啰嗦了这么多,解决这个问题无非就是两个办法:
1.抛出RuntimeException
2.抛出Exception,同时在事务声明中加上@Transactional(rollbackFor = Exception.class)
如果有写到不对的地方,欢迎多多指正
还要再说明一点,在controller中调用service的这个已经解决的方法是可以try catch的,不用担心不会回滚,因为已经被aop监听到了。
在Service中抛出异常事务未回滚问题分析与解决的更多相关文章
- SSM框架中,事务无法回滚的原因和解决
原因: 由ServletContextListener加载spring配置文件产生的是父容器,springMVC产生的是子容器,子容器对Controller进行扫描装配时装配了@Service注解的实 ...
- Spring事务不回滚原因分析
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离. 在我完成一个项目的时候,遇到了一个Spring事务不回滚的问题,通过aspectJ和@Transacti ...
- [存储过程]中的事务(rollback)回滚
在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... del ...
- Spring3声明式事务处理事务无法回滚rollback分析(annotation与xml配置混用)
新项目试运行,DBA提示生产数据库一个表的事务20分钟都未提交,分析过程如下: 1.查看日志log文件,最近20分钟是否有error日志: 2.发现某表有insert错误日志,初步判断由该表插入异常, ...
- Spring声明式事务不回滚问题
疑问,确实像往常一样在service上添加了注解 @Transactional,为什么查询数据库时还是发现有数据不一致的情况,想想肯定是事务没起作用,出现异常的时候数据没有回滚.于是就对相关代码进行了 ...
- springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
一.知识点及问题 后端框架: Spring .Spring mvc .mybatis 业务需求: client先从服务端获取用户大量信息到client,编辑完毕之后统一Post至服务端,对于数据的改动 ...
- spring + myBatis 常见错误:注解事务不回滚
最近项目在用springMVC+spring+myBatis框架,在配置事务的时候发现一个事务不能回滚的问题. 刚开始配置如下:springMVC.xml配置内容: spring.xml配置内容 从上 ...
- spring事务——try{...}catch{...}中事务不回滚的几种处理方式
当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @ResponseBody @RequestMapping(value = "/payment" ...
- spring事务——try{...}catch{...}中事务不回滚的几种处理方式(转载)
转载自 spring事务——try{...}catch{...}中事务不回滚的几种处理方式 当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @Respon ...
随机推荐
- python学习:函数传参数
#!/usr/bin/python import sys def isNum(s): for i in s: if i in '0123456789': ...
- 织梦调用seotitle
如果有seotitle则调用seotitle,没有则调用title {dede:field.array runphp='yes'} if(@me['seotitle']=='') {@me=@me[' ...
- 获取登陆用户的ip
function getip(){ static $ip = null; if($ip !=null) return $ip; if(getenv('REMOTE_ADDR') ...
- Tomcat8.5.24日志自动清理(maxDays)功能探究
前言 测试人员反馈tomcat目录下的日志占用空间很大,需要自动清理.接到这个反馈时,想象着应该是一个很简单的功能,tomcat应该已经实现了日志的自动清理功能.于是乎,我先到网上查询了如何自动清除t ...
- 如何通过SpringBoot官方手册集成RabbitMQ
众所周知,SpringBoot是对Spring的一层封装,用来简化操作. 随着SpringBoot的越发成熟,很多的流行技术都提供了SpringBoot的版本. 可以点击下方的连接查看spring-b ...
- Flask從入門到入土(三)——模板
模板是一個包含響應文本的文件,其中包含佔位變量表示的動態部分,其具體值只是請求上下文中才能知道.使用真實值替換變量,再返回最終得到的響應字符串,這一過程稱爲渲染.爲了渲染模板,Flask使用了一個名爲 ...
- spring cron 定时任务
文章首发于个人博客:https://yeyouluo.github.io 0 预备知识:cron表达式 见 <5 参考>一节. 1 环境 eclipse mars2 + Maven3.3. ...
- UESTC - 1057 秋实大哥与花 线段树
题意 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前. 所以秋实大哥精心照料了很多花朵.现在所有的花朵排成了一行,每朵花有一个愉悦值. 秋实大哥每天要对着某一段连续的花朵歌唱,然后这些花朵的愉 ...
- soj1091 指环王 bfs+hash+剪枝
原题链接http://acm.scu.edu.cn/soj/problem.action?id=1091 这题的主要解法就是搜索,我用的是bfs,用map将二维数组处理成字符串作为主键,到达当前状态的 ...
- mac上搭建appium+IOS自动化测试环境(一)
阅读须知 由于OS X系统最近才开始接触,所以有些东西也不是很清楚,这里只提供方法不提供原理,能解释清楚的我也会尽量解释.可能也有一些地方说的不严谨或有错的,还望大家指点一二. 实验环境 操作系统: ...