`

spring异常与事务回滚

    博客分类:
  • SSIH
 
阅读更多
如果你不启用事务,默认是自动提交的,不需要设置autoCommit

如果你需要使用事务,那么在进行数据库操作之前需要
// 设置不自动提交, 事务开始
conn.setAutoCommit(false);

// 这里进行数据库操作

// 提交事务
conn.commit();


Spring的AOP事务管理默认是针对unchecked exception回滚。
也就是默认对RuntimeException()异常极其子类进行事务回滚。
Exception作为基类,下面还分checked exception和unchecked exception。如果客户端可以通过其他的方法恢复异常,那么这种异
常就是checked exception;如果客户端对出现的这种异常无能为力,那么这种异常就是Unchecked exception;简单来说,继承于
RuntimeException的都是unchecked exception。
Error:
1.总是不可控制的(unchecked)
2.经常用来用于表示系统错误或低层资源的错误
3.如何可能的话,应该在系统级被捕捉

Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)
2.表示一个由程序员导致的错误
3.应该在应用程序级被处理

Java 中定义了两类异常:
1) Checked exception: 这类异常都是Exception的子类。异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中

也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。
2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是

非凡的,它们不能通过client code来试图解决,所以称为Unchecked exception 。

解决办法:

1.在针对事务的类中抛出RuntimeException异常,而不是抛出Exception。

2.在txAdive中增加rollback-for,里面写自己的exception,例如自己写的exception为

com.cn.untils.exception.***Exception

<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="*" rollback-for="com.cn.untils.exception.***Exception"/>
  </tx:attributes>
</tx:advice>

或者

定义不会滚的异常

<tx:advice id="txAdvice">
   <tx:attributes>
      <tx:method name="update*" no-rollback-for="IOException"/>
      <tx:method name="*"/>
   </tx:attributes>
</tx:advice>

spring事务回滚.默认情况,unchecked异常,即运行时异常runntimeException回滚事务;checked异常,即Exception可try{}捕获的不会回滚.当然也可配置spring参数让其回滚.

默认情况下,spring框架只捕获RuntimeException异常及其子类;对于Exception异常是不会回滚的,如果相让Spring来改变这种默认的行为,那么可以在相应的方法上面加入@Transactional(rollbackFor=MyException.class)设置成回滚,从而改变默认的行为。


令Spring的几种注解事务传播行为 :

Required:业务方法需要在一个事务中运行。如果方法运行时,已经在一个事务中,那么加入到该事务,否则自己创建一个新的事务。一般spring默认都是这种事务,像保存,删除,修改等都是这种事务。80%的情况下都用这种事务。

Not_Supported:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会执行。

Requiresnew:属性不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先事务才会恢复执行。

Mandatory:该属性指定业务方法必须在一个事务中运行,业务方法不能发起自己的事略。如果业务方法在没有事务的环境下调用,容器会抛出例外。

Supports:这一事务属性表明,如果方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。

Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。


Nested:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按Required属性执行,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响,它只对DataSourceTransactionManager事务管理器起效。


对于传播行为为REQUIRED的:
1、执行service.method1(),不管method里面是否嵌套了method2或其他,事务都是以method1开始和结尾,且事务配置同样以method1为准,忽略其他REQUIRED行为的配置,比如异常机制,以method1为准,忽略method2的异常配置
2、Transactional的异常控制,默认是Check Exception 不回滚,unCheck Exception回滚
3、如果配置了rollbackFor 和 noRollbackFor 且两个都是用同样的异常,那么遇到该异常,还是回滚
4、rollbackFor 和noRollbackFor 配置也许不会含盖所有异常,对于遗漏的按照Check Exception 不回滚,unCheck Exception回滚

5 noRollbackFor 配置runtimeException 也不会回滚。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Spring异常捕获且回滚事务解决方案

    主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本

    spring事务异常回滚实例解析

    主要介绍了spring事务异常回滚实例解析,具有一定借鉴价值,需要的朋友可以参考下

    Spring事务原理、Spring事务配置的五种方式

    如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么其实现原理一定很深奥吧?可是如果读者仔细研究了Spring事务...

    spring五种事务配置demo

    本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    * 默认事务回滚异常是RuntiimeException(包括所有继承RuntimeException的子类).普通异常不回滚 * 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理(Struts) * spring的事务管理需要添加到业务逻辑上...

    基于springcloud+springboot+nacos+openFeign的分布式事务组件seata项目源码.zip

    最后出现异常则统一回滚,负责统一提交; 第一阶段:准备阶段(prepare)协调者通知参与者准备提交订单,参与者开始投票。协调者完成准备工作向协调者回应Yes。 第二阶段:提交(commit)/回滚(rollback)阶段协调者...

    【Spring源码解析】事务流程解析

    抛出异常,事务回滚。最小的执行单位为方法。决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败。 2、代码 (1) mysql建表语句 CREATE TABLE `t_student` ( `c_id` int(11) NOT NULL AUTO_INCREMENT, `c...

    第24次课-1 Spring与Hibernate的整合

    为了更好地与持久层框架整合,Spring还提供了统一的异常处理体系和事务管理方法。 24.1 概述 24.1.1 概述 如果Spring与Hibernate进行了整合,则Hibernate便处于被Spring管理的状态下,Hibernate所需的基础资源,都由...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    尚硅谷佟刚Spring4代码及PPT.rar

    JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。

    Spring_Hibernate集成

    * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的 * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理 * 关于事务边界的设置,通常设置到业务层,...

    Spring 2.0 开发参考手册

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...

    Spring中文帮助文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    spring chm文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...

    Spring API

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring_doc

    Spring的事务管理通过AOP代理来实现 根据事务属性,对每个代理对象的每个方法进行拦截, 在方法执行前启动事务, 方法执行完毕后根据是否有异常和异常种类进行... spring 默认通过捕获运行时异常实现事务提交或回滚

    Spring.html

    默认-1(永不超时),事务一直不提交也不回滚的时间 是否只读: 默认false TransactionManagerStatus: 事务的一些状态 整合 Spring整合Junit 1.导入依赖spring-test 2.加注解:RunWith、...

    Spring面试题详细讲解

    描述 Spring 事务的只读、超时、回滚的原则。 1. Spring 事务的只读“只读事务”并不是一‘’个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作

    tx-lcn_4.1.0.rar

    基于springboot1.5、springcloud,以tx-lcn_4.1.0实现分布式事务demo,其中tm项目为txManager,测试tc1项目调用tc2项目,模拟异常信息实现分布式事务回滚

Global site tag (gtag.js) - Google Analytics