Spring事务管理只对出现运行期异常进行回滚

转载 2016年08月30日 23:39:37
使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。

2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。

结论:

在spring的事务管理环境下,使用unckecked exception可以极大地简化异常的处理,只需要在事务层声明可能抛出的异常(这里的异常可以是自定义的unckecked exception体系),在所有的中间层都只是需要简单throws即可,不需要捕捉和处理,直接到最高层,比如UI层再进行异常的捕捉和处理

在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。

Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked

如果遇到checked意外就不回滚。

如何改变默认规则:

1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

 

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。


一个统一的异常层次结构对于提供服务抽象是必需的。 最重要的就是org.springframework.dao.DataAccessException以及其子类了。 需要强调的是Spring的异常机制重点在于应用编程模型。与SqlException和其他数据存取API不同的是: Spring的异常机制是为了让开发者使用最少, 最清晰的代码。DataAccessException和其他底层异常都是非检查性异常(unchecked exception)。 spring的原则之一就是基层异常就应该是非检查性异常. 原因如下: 
1. 基层异常通常来说是不可恢复的。 
2. 检查性异常将会降低异常层次结构的价值.如果底层异常是检查性的, 那么就需要在所有地方添加catch语句进行捕获。 
3.try/catch代码块冗长混乱, 而且不增加多少价值。 
使用检查异常理论上很好, 但是实际上好象并不如此。 
Hibernate3也将从检查性异常转为非检查性异常。

解决spring 事务管理默认不支持SQLException等运行时异常

公司同事在定位一个bug时,发现spring默认的事务只支持运行时异常的回滚,对于像SQLException这样的非运行时异常,默认的事务机制不能处理,于是找了下解决的办法: 1、在捕获SQLExc...
  • mingtianhaiyouwo
  • mingtianhaiyouwo
  • 2015年11月06日 20:15
  • 593

eureka监听各服务状态,下线、重连等,并做相应的处理

在一些场景下,我们需要监听eureka服务中心的一些状态,譬如某个微服务挂掉了,我们希望能监听到,并给管理员发送邮件通知。Eureka的server端会发出5个事件通知,分别是:EurekaInsta...
  • tianyaleixiaowu
  • tianyaleixiaowu
  • 2017年10月10日 15:11
  • 2436

springBoot service 事务注解@Transactional不起作用的解决

在springBoot使用事物时,发现事物并没有正常执行,没有进行回滚。 @GetMapping("add") @ResponseBody @Transactional pub...
  • BestLovelyMin
  • BestLovelyMin
  • 2017年07月11日 11:34
  • 4265

Spring boot配置的事务失效,出现错误数据不回滚解决方案

修改mysql数据库表的引擎: alter table demo engine=innodb; 如果报innodb不能使用:     解决方法:         1.关闭MySQL数据库   ...
  • shunhua19881987
  • shunhua19881987
  • 2017年07月18日 16:56
  • 1494

Spring boot事务管理只异常不回滚的解决方案

处理springboot 下提交事务异常,数据库没有回滚的问题。 spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。 ...
  • KokJuis
  • KokJuis
  • 2017年11月17日 14:25
  • 693

Spring ActiveMQ 整合(四): JMS 事务管理

1.为什么要用事务?        消息事务是在生产者producer到broker或broker到consumer过程中同一个session中发生的,保证几条消息在发送过程中的原子性。      ...
  • dly1580854879
  • dly1580854879
  • 2017年04月01日 16:46
  • 2595

SpringBoot配置属性之MQ

activemq spring.activemq.broker-url指定ActiveMQ broker的URL,默认自动生成. spring.activemq.in-memo...
  • alibert
  • alibert
  • 2016年12月17日 18:49
  • 2747

关于spring boot 事务

redis事务 redis最好的事务方式还是用它自己的watch 读数据,然后再用multi进行锁定,最后用exec执行,如果成功返回[null,true],如果失败返回操作结果[结果,fals...
  • evane1890
  • evane1890
  • 2017年03月13日 00:03
  • 1754

SpringBoot配置属性之MQ

activemq spring.activemq.broker-url指定ActiveMQ broker的URL,默认自动生成. spring.activemq.in-memory是否是内存模式...
  • qq_24084925
  • qq_24084925
  • 2016年11月25日 22:38
  • 1611

在Spring Boot中使用数据库事务

我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源( 在Spring Boot中输出REST...
  • u012702547
  • u012702547
  • 2017年01月05日 22:38
  • 10492
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring事务管理只对出现运行期异常进行回滚
举报原因:
原因补充:

(最多只允许输入30个字)