Spring、EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚

  1. /**
  2. * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型)
  3. * 则spring默认只会在service方法抛出unchecked exception才会触发回滚
  4. */
  5. public class TestServiceImpl extends Service implements TestService {
  6. /**
  7. * 测试spring异常触发事务回滚的service方法
  8. */
  9. public void testAddPerson(String name) throws Exception {
  10. TestPerson p = new TestPerson();
  11. p.setName(name);
  12. this.getHibernateGenericController().save(p);
  13. /*
  14. * 制造RuntimeException
  15. * 在spring默认的异常回滚策略下,该异常的抛出会触发事务的回滚,数据不会被插入
  16. */
  17. throw new RuntimeException("抛出个运行时异常");
  18. /**
  19. * 同样是unchecked exception,spring默认的异常回滚策略下Error的抛出也会触发事务的回滚,数据不会被插入
  20. */
  21. //      throw new Error();
  22. /**
  23. * 即使是在spring默认的异常触发事务回滚策略(unchecked exception触发回滚)下,
  24. * 如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚,数据被插入
  25. * “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常”
  26. */
  27. //      try {
  28. //          throw new RuntimeException("这个抛出的运行时异常会被try-catch捕获");
  29. //      } catch(Exception e) {
  30. //          System.out.println("捕获到异常: " + e.getMessage());
  31. //      }
  32. /**
  33. * 因为Exception类是个checked exception,所以这里抛出的异常不会触发事务的回滚,数据被插入
  34. */
  35. //      throw new Exception("a Exception instance");
  36. /**
  37. * 该BaseException继承自Exception,也为checked exception,抛出它后:
  38. * spring默认的回滚策略下,事务未回滚, 数据被插入;
  39. * 在TransactionProxyFactoryBean的transactionAttributes中配置
  40. <prop key="test*">
  41. ... ...,-BaseException
  42. </prop>
  43. 后,事务回滚,数据未被插入
  44. */
  45. //      throw new BaseException("一个BaseException");
  46. }
  47. }

spring默认对unchecked exception进行回滚。

也可以对规定的checked exception进行回滚: 
<tx:advice id="txAdvice" transaction-manager="txManager"> 
  <tx:attributes> 
  <tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/> 
  <tx:method name="*"/> 
  </tx:attributes> 
</tx:advice>

将异常捕获,并且在catch块中不对事务做显式提交(或其他应该做的操作如关闭资源等)=生吞掉异常

spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常). 
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。 
一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。

Java 中定义了两类异常:

1) Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。C#中就没有使用这种异常机制。

2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们不能通过client code来试图解决,所以称为Unchecked exception 。

checked exception是需要强制catch的异常,你在调用这个方法的时候,你如果不catch这个异常,那么编译器就会报错,比如说我们读写文件的时候会catch IOException,执行数据库操作会有SQLException等 
UnChecked Exception是RuntimeException,也就是说运行时的异常,这种异常不是必须需要catch的,你是无法预料的,比如说你在调用一个list.szie()的时候,如果这个list为null,那么就会报NUllPointerException,而这个异常就是RuntimeException,也就是UnChecked Exception

Error和RuntimeException及其子类是unchecked exception.其他exception是checked exception. 
checked exception可以出现在throws子句中,unchecked exception不可以。 
Error是java自己的错误或者诸如内存耗尽等严重错误,是不可抗拒的,显然没有捕捉的必要,而且也没有办法捕捉。 
RuntimeException是你的程序有逻辑错误,是程序员应该积极避免其出现的异常。比如NullPointerException等,完全是程序员马虎出的错。当遇到这种错误时,java将这个错误自动捕捉到,比如显示到concole里,然后继续运行。而checked exception如果不捕捉则会导致程序终止。

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况

error和excption的区别
 
Error的继承关系:
 
java.lang.Object

--java.lang.Throwable
 
--java.lang.Error
 
Exception的继承关系:
 
java.lang.Object
 
--java.lang.Throwable
 
--java.lang.Exception
 
二者的不同之处:
 
Exception:
 
1.可以是可被控制(checked) 或不可控制的(unchecked)
 
2.表示一个由程序员导致的错误
 
3.应该在应用程序级被处理
 
Error:
 
1.总是不可控制的(unchecked)
 
2.经常用来用于表示系统错误或低层资源的错误
 
3.如何可能的话,应该在系统级被捕捉

Spring异常抛出触发事务回滚的更多相关文章

  1. (转)spring异常抛出触发事务回滚策略

    背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchec ...

  2. spring boot 使用 mybatis 开启事务回滚 的总结

    1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改 ...

  3. Spring mvc注解方式使用事务回滚

    项目名:1ma1ma jdbc.xml <bean  id="dataSource" class="org.apache.commons.dbcp.BasicDat ...

  4. 采购订单写入sap失败后,抛出自定义异常,回滚数据库

    @Transactional(rollbackFor = Exception.class) @Override public Map<String,Object> getOderInfo( ...

  5. spring @Transaction事务回滚失败

    今天客户提出一个新问题,出库一批商品,提示失败了,但是库存数量却减少了.看了一下代码一头雾水,我们的代码加了事物,且捕获异常. 经过调试代码发现就是两个原因导致的 第一.在当前方法的catch中处理了 ...

  6. Spring 事务回滚机制详解

    1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocat ...

  7. Java进阶知识24 Spring的事务管理(事务回滚)

    1.事务控制概述   1.1.编程式事务控制         自己手动控制事务,就叫做编程式事务控制.         Jdbc代码: connection.setAutoCommit(false); ...

  8. Spring事务回滚和异常类

    1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和Exception继承Throwable.Error和RuntimeException及其子类成为未检查异常( ...

  9. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

随机推荐

  1. Codis集群

    一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Re ...

  2. TextView 获取行数,某一行的内容,某行的宽度

    获取行数 ViewTreeObserver vto = textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlob ...

  3. [SI]source insight使用

    1. 快捷键 Ctrl+O: 工程中查找需要的文件如imx.c Ctrl+F: 当前文件查找字符串,然后Alt+W(hole)可以列出所有找到的位置 Ctrl+/:可以在当前project中查找字符串 ...

  4. Dojo特效(翻译)

    http://dojotoolkit.org/documentation/tutorials/1.10/effects/index.html In this tutorial, we will exp ...

  5. SQL的OPENROWSET开启和使用方法

    [转载]SQL的OPENROWSET开启和使用方法 1.开始 -> 所有程序  -> Microsoft SQL Server 2005  -> 配置工具  -> SQL Se ...

  6. SpringToolSuite/Eclipse中集成的Tomcat无法add Project时的解决版本

  7. centos7 firewall 防火墙

    在部署dubbo-monitor 和dubbo-admin zookeeper时候,外部访问不了部署好的服务,因为端口问题 ,现在把端口操作总结一下 参考: http://www.cnblogs.co ...

  8. centos6.3(64位) 安装apr

    安装apr来提高tomcat 的可伸缩性和性能 ? 1 cd /usr/local/ 1  下载apr 和 apr-util最新版 ? 1 2 3 wget  http://apache.fayea. ...

  9. 转来的emacs配置文件,自动安装插件

    网上转来的emacs配置文件,便于自动安装插件,收藏起来 http://www.gogae.org/post-7/ EMACS是一个伪装成代码编辑器的操作系统. EMACS是一个非常强大的代码编辑器, ...

  10. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...