Spring transaction事务之roll back回滚: rollback-for
试验方法:
写一个单元测试,调用一个service层方法(发生对数据库进行写操作的方法--insert、update、delete)即可.
applicationContext.xml 样子(如何设置rollback-for)
- <!--
- spring事务管理 方法一-->
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <aop:config>
- <aop:pointcut id="serviceOperation" expression="execution(*
- com.*.service.*.*(..))" />
- <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice" />
- </aop:config>
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="insert*" rollback-for="Exception" />
- <tx:method name="save*" rollback-for="Exception" />
- <tx:method name="update*" rollback-for="Exception" />
- <tx:method name="delete*" rollback-for="Exception" />
- <tx:method name="*" read-only="true" rollback-for="Exception" />
- </tx:attributes>
- </tx:advice>
试验过程:
定义一个service方法如下:
public SMSTiming createSMSTiming(SMSTiming smsTiming){
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
return s;
}
定义二个异常(先默认配置TestException为Spring事务回滚异常):
publicclass MyTestException extends Exception
publicclass TestException extends Exception
注意看下:每次这个方法的不同处(抛出的异常不同)。
测试1:
public SMSTiming createSMSTiming(SMSTiming smsTiming){
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
int i = 4/0; //人为产生异常(实际这里抛出了ArithmeticException运行异常)
return s;
}
测试1结果:会事务回滚----数据库中未插入新数据。
测试2:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws Exception{//受检异常(非运行异常)必须抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownew Exception ("");//抛出Exception异常
}
return s;
}
测试2结果:不会事务回滚----数据库中插入新数据。
测试3:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws RuntimeException{//运行异常(非受检异常)可以不抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewRuntimeException("");//抛出RuntimeException异常
}
return s;
}
测试3结果:会事务回滚----数据库中未插入新数据
测试4:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws TestException{//受检异常(非运行异常)必须抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewTestException("");//抛出TestException异常
}
return s;
}
测试4结果:会事务回滚----数据库中未插入新数据。
测试5:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws MyTestException{//受检异常(非运行异常)必须抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewMyTestException("");//抛出MyTestException异常
}
return s;
}
测试5结果:不会事务回滚----数据库中插入新数据。
测试6:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws MyTestException{//受检异常(非运行异常)必须抛出 (注意:此时spring指定配置此异常回滚)
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewMyTestException("");//抛出MyTestException异常
}
return s;
}
测试6结果:会事务回滚----数据库中未插入新数据。
试验总结:
测试1、测试3、测试4、测试6会进行事务回滚;测试2、测试5不会进行事务回滚。
为什么会这样?因为是异常的类型(受检异常、运行时异常)不同或使用了Spring的rollback-for配置。
测试1和测试3是因为抛出了运行时异常,会事务回滚。
测试4和测试5、测试6分别抛出受检异常TestException、MyTestException,那为什么测试4和测试6会事务回滚呢?
因为是我们在Spring事务配置中指定了此异常(指定rollback-for)。
又一篇文章:
昨天同事说Spring的Transactional必须添加rollbackFor = Exception.class,否则事务不会回滚。但我原来试过,抛出RuntimeException时是会回滚的。于是查看Spring的Transactional的API文档,发现下面这段:
If no rules are relevant to the exception, it will be treated like DefaultTransactionAttribute
(rolling back on runtime exceptions).
后面又试了下发现,如果不添加rollbackFor等属性,Spring碰到Unchecked Exceptions都会回滚,不仅是RuntimeException,也包括Error。
=============================================
Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出一个RuntimeException
或其子类例的实例时。(Errors
也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚
Spring transaction事务之roll back回滚: rollback-for相关推荐
- spring中事务执行完成后/回滚后执行
有时候业务场景需要 在事务结束后执行一些更新操作; 或者在事务失败回滚后执行一些更新表状态的操作; 就可以用到如下代码: @Transactional(rollbackFor = Exception. ...
- Spring事务管理中异常回滚知识点总结
记录总结Spring核心知识点:事务使用与它的传播机制 目录 前言 问题场景 Spring 管理事务的原理 MySQL中的事务管理 JDBC中的事务管理 Spring 中的事务管理 Spring中的事 ...
- Spring事务总结(一) 内部调用事务失效、异常回滚
Spring事务总结(一) 内部调用事务失效.异常回滚 参考文章: (1)Spring事务总结(一) 内部调用事务失效.异常回滚 (2)https://www.cnblogs.com/gss128/p ...
- sql事务(Transaction)用法介绍及回滚实例
sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...
- oracle表结构修改回滚,87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚...
87.Oracle数据库SQL开发之 修改表内存--数据库事务的提交和回滚 数据库事务(transaction)就是一组SQL语句,这组SQL语句时一个逻辑工作单元. 要永久性的记录事务中SQL语句的 ...
- java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析
用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行 ...
- 事务的提交commit、回滚rollback
1.事务 事物由一个或多个sql语句组成,如果其中一个语句不能完成,整个单元就会回滚,所有影响到的数据将返回到事物开始以前的状态.因而,只有事物中的所有语句都成功执行,才能说明这个事物被成功的执行. ...
- Java-JDBC【之】事务介绍、事务特性、操作事务(事务提交、异常回滚)
Java-JDBC[之]事务介绍.事务特性.操作事务(事务提交.异常回滚) 1.数据库事务 1.1.介绍 1.2.事务特性(ACID) 1.3.隔离性(Isolation),带来的问题与处理 1.4. ...
- java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...
详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...
最新文章
- 框架和库有什么区别? [关闭]
- django 学习笔记
- openMP 并行编程 基础
- CSV适用于表格式数据, Json适用于接口和配置文件
- 随机数生成java代码_Java Bullshifier –生成大量随机代码库
- ajax长链接--拉实现
- postgresql,pgadmin4安装后出错,界面只有文字
- 吴恩达机器学习 5.正则化
- s-palindrome
- 如何使用IVT BlueSoleil 如何在电脑上使用蓝牙耳机
- 暴走恭亲王:Jed McCaleb才是中本聪大魔王?
- 绘制AutoCad中的曲线(Curve)
- HP CQ40-512TX不刷BIOS安装XP系统
- R语言使用min函数获得向量数据的最小值
- PDF如何裁剪页面,PDF裁剪页面的方法
- 树莓派(七):调取IP摄像头
- 使用httpclient必须知道的参数设置及代码写法、存在的风险
- ping 不通。无法访问目标主机
- et结波导口转换_波导转接器
- 智能化办公系统解决方案
热门文章
- linux查看服务器负载均衡,Linux服务器负载均衡LB
- 荣耀6 原生Android,荣耀6 (移动4G) 官方原生简约实用 流畅省电 杜比音效 网速显示-刷机之家...
- 岳阳机器人餐厅在哪_从机器人咖啡看未来餐饮行业大方向,如何才能活下去?...
- C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
- 旋转角度_办公娱乐新神器!这款稳固的创意支架,360°旋转随便换角度
- Coding and Paper Letter(二十四)
- 如何使用Salt 的各种状态值
- ORACLE导入TXT文件数据的解决思路
- 自定义类似于listView中Item背景
- Pictures for active reading.Unit 1 Food and health.