Spring-Java事物回滚失效处理
来源:互联网 发布:青少年编程最好的机构 编辑:程序博客网 时间:2024/06/05 18:30
spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。
一切还是要从Java的检查型异常和非检查型异常说起。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自RuntimeException或Error的是非检查型异常,而继承自Exception的则是检查型异常(当然,RuntimeException本身也是Exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try……catch语句块进行处理或者把异常交给上级方法处理,总之就是必须写代码处理它。
Java 的异常结构如下图。其中直接继承Exception的异常,必须捕获,属于检查型异常。
再回过来看我的代码:
1、方法名前面有
- @Transactional
2、Spring的配置文件applicationContext-XXX.xml当中也有Spring事物的相关配置
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- <property name="rollbackOnCommitFailure" value="true"></property>
- </bean>
但是为什么在Service层方法调用的时候,try……catch抛Exception异常已经提交的事物却没有回滚?
查看相关spring的文档后发现,原来spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
代码中try……catch抛出的Exception异常,属于检查型异常,Spring的框架默认是不会进行回滚的。
在编程中对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。
所以必须在service捕获异常,然后再次手动 throw 一个非检查型异常,这样事务方才起效。例如:
- try{
- …………
- } catch (Exception e) {
- …………
- throw new BusinessException(e.getMessage());
- }
或者
catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是这一句了,加上之后,如果doDbStuff2()抛了异常, //doDbStuff1()是会回滚的 }
当然我们还有更简便的方法来解决这个问题,那就是通过注解参数改变默认的回滚方式 。
在@Transaction注解中定义了noRollbackFor和RollbackFor来指定某种异常是否回滚。
使用例:
@Transaction(noRollbackFor=RuntimeException.class)
@Transaction(RollbackFor=Exception.class)
所以上述的问题可以直接将@Transaction添加回滚参数@Transaction(RollbackFor=Exception.class) ,这样就改变了默认的事务处理方式。
启示 :
这就要求我们在自定义异常的时候,让自定义的异常继承自RuntimeException,这样抛出的时候才会被Spring默认的事务处理准确处理。- Spring-Java事物回滚失效处理
- Spring-Java事物回滚失效处理
- spring事物回滚
- Spring事物回滚
- Spring事物回滚详解
- spring-控制事物回滚
- Spring MVC 事物回滚
- Spring 事物手动回滚
- spring事物异常回滚
- Spring事物手动回滚
- spring 手动回滚事物
- Spring 事物手动回滚
- spring@transactional事物回滚
- Java jdbc事物回滚处理,纯手工打造
- spring学习----spring事物异常回滚
- JDBC事物处理(回滚)
- spring事物回滚之AOP
- spring事物的提交与回滚
- C#值类型与引用类型、 out 、 ref、 params 参数、函数重载、数组为函数参数或返回值
- POS 初识
- 【PMP认证考试之个人总结】第 5 章 项目时间管理
- IMWeb提升营Day2 | 训练题7: 斐波那契数列
- Sublime Text概览
- Spring-Java事物回滚失效处理
- Swift 2.3迁到3.0的一些细节(不定期写)
- form标签中有button标签就会重新加载页面
- React
- 配置eclipse中jsp/html页面自动提示
- DeepLearning#之浅层与深层的训练(一)
- HDU1577--WisKey的眼神(扩展欧几里德)
- WAP2017春招2
- Java基础