试验方法:

写一个单元测试,调用一个service层方法(发生对数据库进行写操作的方法--insert、update、delete)即可.

applicationContext.xml 样子(如何设置rollback-for)

  1. <!--
  2. spring事务管理 方法一-->
  3. <bean id="transactionManager"
  4. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  5. <property name="dataSource" ref="dataSource" />
  6. </bean>
  7. <aop:config>
  8. <aop:pointcut id="serviceOperation" expression="execution(*
  9. com.*.service.*.*(..))" />
  10. <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice" />
  11. </aop:config>
  12. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  13. <tx:attributes>
  14. <tx:method name="insert*" rollback-for="Exception" />
  15. <tx:method name="save*" rollback-for="Exception" />
  16. <tx:method name="update*" rollback-for="Exception" />
  17. <tx:method name="delete*" rollback-for="Exception" />
  18. <tx:method name="*" read-only="true" rollback-for="Exception" />
  19. </tx:attributes>
  20. </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相关推荐

  1. spring中事务执行完成后/回滚后执行

    有时候业务场景需要 在事务结束后执行一些更新操作; 或者在事务失败回滚后执行一些更新表状态的操作; 就可以用到如下代码: @Transactional(rollbackFor = Exception. ...

  2. Spring事务管理中异常回滚知识点总结

    记录总结Spring核心知识点:事务使用与它的传播机制 目录 前言 问题场景 Spring 管理事务的原理 MySQL中的事务管理 JDBC中的事务管理 Spring 中的事务管理 Spring中的事 ...

  3. Spring事务总结(一) 内部调用事务失效、异常回滚

    Spring事务总结(一) 内部调用事务失效.异常回滚 参考文章: (1)Spring事务总结(一) 内部调用事务失效.异常回滚 (2)https://www.cnblogs.com/gss128/p ...

  4. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  5. oracle表结构修改回滚,87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚...

    87.Oracle数据库SQL开发之 修改表内存--数据库事务的提交和回滚 数据库事务(transaction)就是一组SQL语句,这组SQL语句时一个逻辑工作单元. 要永久性的记录事务中SQL语句的 ...

  6. java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析

    用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行 ...

  7. 事务的提交commit、回滚rollback

    1.事务 事物由一个或多个sql语句组成,如果其中一个语句不能完成,整个单元就会回滚,所有影响到的数据将返回到事物开始以前的状态.因而,只有事物中的所有语句都成功执行,才能说明这个事物被成功的执行. ...

  8. Java-JDBC【之】事务介绍、事务特性、操作事务(事务提交、异常回滚)

    Java-JDBC[之]事务介绍.事务特性.操作事务(事务提交.异常回滚) 1.数据库事务 1.1.介绍 1.2.事务特性(ACID) 1.3.隔离性(Isolation),带来的问题与处理 1.4. ...

  9. java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...

    详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...

最新文章

  1. 框架和库有什么区别? [关闭]
  2. django 学习笔记
  3. openMP 并行编程 基础
  4. CSV适用于表格式数据, Json适用于接口和配置文件
  5. 随机数生成java代码_Java Bullshifier –生成大量随机代码库
  6. ajax长链接--拉实现
  7. postgresql,pgadmin4安装后出错,界面只有文字
  8. 吴恩达机器学习 5.正则化
  9. s-palindrome
  10. 如何使用IVT BlueSoleil 如何在电脑上使用蓝牙耳机
  11. 暴走恭亲王:Jed McCaleb才是中本聪大魔王?
  12. 绘制AutoCad中的曲线(Curve)
  13. HP CQ40-512TX不刷BIOS安装XP系统
  14. R语言使用min函数获得向量数据的最小值
  15. PDF如何裁剪页面,PDF裁剪页面的方法
  16. 树莓派(七):调取IP摄像头
  17. 使用httpclient必须知道的参数设置及代码写法、存在的风险
  18. ping 不通。无法访问目标主机
  19. et结波导口转换_波导转接器
  20. 智能化办公系统解决方案

热门文章

  1. linux查看服务器负载均衡,Linux服务器负载均衡LB
  2. 荣耀6 原生Android,荣耀6 (移动4G) 官方原生简约实用 流畅省电 杜比音效 网速显示-刷机之家...
  3. 岳阳机器人餐厅在哪_从机器人咖啡看未来餐饮行业大方向,如何才能活下去?...
  4. C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
  5. 旋转角度_办公娱乐新神器!这款稳固的创意支架,360°旋转随便换角度
  6. Coding and Paper Letter(二十四)
  7. 如何使用Salt 的各种状态值
  8. ORACLE导入TXT文件数据的解决思路
  9. 自定义类似于listView中Item背景
  10. Pictures for active reading.Unit 1 Food and health.