spring事务在什么情况会回滚

worktile 其他 64

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring事务在以下情况下会发生回滚:

    1. 运行时异常:如果任何未捕获的运行时异常在事务中抛出,Spring会回滚该事务。例如,NullPointerException、ArrayIndexOutOfBoundsException等。

    2. 受检异常:默认情况下,Spring只会回滚未捕获的运行时异常。对于受检异常(即必须在方法签名中声明的异常),Spring默认不会触发事务回滚。但是,你可以配置Spring来回滚指定的受检异常。

    3. RuntimeException显式指定要回滚的异常类型:你可以使用@Transactional(rollbackFor = Exception.class)注解,指定要回滚的异常类型。这样,不仅会回滚RuntimeException,还会回滚其他所有异常。

    4. 抛出指定的异常时:你可以使用@Transactional(noRollbackFor = Exception.class)注解,指定不应该回滚的异常类型。如果抛出指定的异常之一,事务将不会回滚。

    5. 手动回滚:你可以在代码中使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法,手动触发事务回滚。这在某些业务逻辑需要非标准回滚策略时非常有用。

    6. 异常转换:当捕获到异常后,Spring会将其转换为org.springframework.transaction.TransactionException的子类,并在事务中重新抛出。你可以定义自己的异常类,并使用@ControllerAdvice@ExceptionHandler注解进行全局异常处理。

    以上是Spring事务回滚的情况,你可以根据具体的业务需求和异常处理策略,灵活地配置事务回滚的行为。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring框架中的事务管理功能可以在一些情况下自动回滚事务。以下是触发Spring事务回滚的一些常见情况:

    1. 运行时异常:当发生未捕获的运行时异常时,Spring会自动回滚事务。例如,如果在事务内部抛出了NullPointerException或ArrayIndexOutOfBoundsException等未检查异常,事务将被回滚。

    2. 标记为回滚的异常:可以通过在方法中使用@Transactional注解并指定rollbackFor属性来标记一个或多个异常类,当这些异常发生时,事务将被回滚。例如,@Transactional(rollbackFor = {SQLException.class, IOException.class})表示当发生SQLException或IOException时,事务将被回滚。

    3. 运行时异常的子类:除了捕获具体的运行时异常类之外,还可以使用其子类来触发事务回滚。这对于处理更具体的异常情况很有用。例如,如果指定rollbackFor = NullPointerException.class,那么当抛出NullPointerException的子类异常时,事务也将被回滚。

    4. 非受检异常:Spring默认将Error和RuntimeException及其子类都视为非受检异常。当发生非受检异常时,事务将被回滚。受检异常(Checked Exception)不会触发事务回滚,除非通过rollbackFor属性显式指定。

    5. 异常检查:如果一个事务方法捕获了异常并处理了它,没有将其重新抛出,那么事务将不会回滚。这是因为Spring假设方法已经处理了异常,并认为不再需要回滚事务。

    需要注意的是,Spring事务回滚的行为也可以通过使用@Transactional注解中的其他属性进行定制。例如,可以使用noRollbackFor属性指定哪些异常不会触发事务回滚,或者可以使用readOnly属性来指定是否将事务设置为只读模式,不允许对数据库进行任何修改操作。此外,还可以使用TransactionTemplate类或Programmatic transaction management方法编程式管理事务回滚。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务可以根据不同的情况来决定是否回滚。下面将从方法、操作流程等方面详细讲解。

    一、Spring事务的回滚方式
    Spring事务管理器提供了两种事务回滚的方式:

    1. 异常触发回滚:当方法抛出RuntimeException(和其子类)、Error、以及特殊配置的异常时,Spring事务管理器会自动回滚事务。
    2. 手动触发回滚:当在方法中调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法时,Spring事务管理器会回滚事务。

    二、Spring事务的操作流程
    Spring事务的操作流程主要分为如下几个步骤:

    1. 方法调用前,创建事务:当一个带有@Transactional注解的方法被调用时,Spring会先创建一个新的事务。如果方法调用的是另一个带有@Transactional注解的方法,则会创建嵌套事务。
    2. 执行方法体:方法体中的业务逻辑会被执行。
    3. 提交或回滚事务:如果方法正常执行结束,事务管理器会提交事务。否则,根据情况选择回滚事务。
    4. 传播至上层调用者:事务的提交或回滚将传播至上层调用方法。
    5. 完成事务:当所有事务都完成后,最终的提交或回滚将被执行。

    三、触发事务回滚的情况

    1. 方法抛出RuntimeException及其子类:默认情况下,Spring事务管理器会回滚在方法中抛出RuntimeException及其子类的异常。
    2. 方法抛出Error:类似于RuntimeException,当方法抛出Error异常时,Spring事务管理器会回滚事务。
    3. 特殊配置异常:可以通过对@Transactional注解进行配置,指定需要回滚事务的异常类型。例如,可以使用rollbackFor属性指定需要回滚事务的异常,如@Transactional(rollbackFor = MyException.class)。
    4. 手动触发回滚:在方法中调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法可以手动触发事务回滚。

    总结:
    Spring事务在方法抛出RuntimeException及其子类、Error、特殊配置异常以及手动触发回滚的情况下会进行事务回滚。在日常开发中,需要根据具体业务需求和异常类型来决定是否进行事务回滚。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部