`

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如何处理事务回滚,以及它是如何在Java源码层面实现这一功能的。 首先,让我们理解什么是事务。在数据库操作中,事务是确保数据一致性的重要机制...

    Spring/SpringMVC/MyBatis整合+事务回滚

    7. **实现事务回滚**:当在@Transactional注解的方法中发生异常时,Spring会自动回滚事务。例如,如果在保存数据时发生错误,整个事务将被回滚,保证数据的一致性。 8. **测试与调试**:完成整合后,通过编写单元...

    Spring中@Transactional事务回滚(含实例

    四、事务回滚与AOP Spring使用代理(Proxy)和面向切面编程(AOP)来实现`@Transactional`注解的功能。当Spring容器创建一个`@Transactional`标注的方法时,它会创建一个动态代理对象,该代理对象会在方法调用前后...

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

    Spring 异常捕获且回滚事务解决方案 在 Spring 框架中,异常捕获和回滚事务是非常重要的概念。今天,我们将讨论如何在 Spring 中捕获异常并回滚事务。 首先,让我们了解一下 Spring 的事务机制。当我们在 Spring ...

    spring-控制事物回滚

    "spring-控制事物回滚"这个主题主要涉及Spring如何在出现异常时自动或手动触发事务的回滚,以及如何配置和使用Spring的事务管理机制。我们将深入探讨Spring事务管理的原理、API使用以及在实际开发中的应用。 首先,...

    子线程任务发生异常,主线程事务如何回滚

    子线程任务发生异常,主线程事务如何回滚? 本文将详细探讨当子线程任务发生异常时,如何让主线程捕获到该异常并进行事务的回滚。下面将从多线程编程的基础知识、线程池的使用、异常捕获三个方面进行阐述。 一、多...

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

    标题中提到的“Spring事务管理只对出现运行期异常进行回滚”这一特性是基于Java异常处理机制的。在Java中,异常分为两种类型:运行时异常(RuntimeException及其子类)和检查异常(CheckedException)。运行时异常是...

    spring事务异常回滚实例解析

    首先,Spring 默认只有在遇到未捕获的 `RuntimeException` 或其子类时才会触发事务回滚。这意味着,如果在业务代码中对异常进行了捕获并处理,而没有再抛出异常,那么事务将不会自动回滚。例如,在提供的代码实例中...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

    mongoDB 4.0事务回滚的辛酸历程探究

    事务回滚是事务处理中的关键部分,确保在出现错误或异常时,数据库能够恢复到事务开始之前的状态。 在升级到MongoDB 4.0之后,首先需要注意的是确保环境的兼容性。使用Homebrew升级MongoDB到4.0.0版本,同时更新`...

    Java Spring 事务回滚详解

    在Spring中,事务回滚规则基于异常类型。默认情况下,只有未检查异常(RuntimeException及其子类)会导致事务回滚,而检查异常(非RuntimeException)不会。这是因为未检查异常通常表示编程错误,而检查异常则通常...

    使用SpringBoot注解方式处理事务回滚实现

    使用 SpringBoot 注解方式处理事务回滚实现 在本文中,我们将介绍使用 SpringBoot 注解方式处理事务回滚实现的方法,并通过示例代码进行详细的讲解。本文对于学习 SpringBoot 的开发者或者工作中需要实现事务回滚的...

    java事务回滚失败问题分析

    在Spring框架中,默认情况下,对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。因此,在编程中,需要注意检查型异常和非检查型异常的区别,并采取相应的处理方法。 一、检查型异常和非...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    此外,需要注意的是,只有当事务边界内的异常是未检查异常(继承自RuntimeException的异常)或者是`Error`时,Spring才会自动回滚事务。对于已检查异常(继承自Exception的非RuntimeException),除非显式声明`@...

    SpringBoot事务使用及回滚实现代码详解

    1. RuntimeException回滚:SpringBoot默认情况下,只有RuntimeException及其子类的异常会导致事务回滚。 2. 手动回滚:使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();方法来手动回滚...

    Spring事务与Java事务比较

    此外,Spring 还提供了事务回滚规则,允许基于异常类型或异常实例来决定是否回滚事务,增强了事务处理的灵活性。 Spring AOP 用于实现事务管理服务,它通过代理模式在方法调用前后插入事务处理代码,无需修改原有...

    Spring Hibernate 事务处理 详细说明

    4. **回滚规则:**默认情况下,如果方法抛出未检查异常(继承自`RuntimeException`)或`Error`,Spring会自动回滚事务。你也可以自定义回滚规则,比如添加`@Transactional(noRollbackFor=SomeException.class)`来...

    Spring中的@Transactional事物回滚实例源码

    本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是Spring提供的一个编程式事务管理方式,它允许我们在方法上声明事务属性,如传播行为、隔离级别、读写模式...

    Spring事务管理Demo

    2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...

Global site tag (gtag.js) - Google Analytics