spring什么情况下事务不回滚

不及物动词 其他 380

回复

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

    在Spring中,事务默认是自动回滚的,除非遇到特定的情况,事务才不会回滚。以下是几种不会触发事务回滚的情况:

    1. 在事务管理器中设置了@Transactional注解的noRollbackFor属性,指定了不回滚的异常类型。当抛出指定的异常时,事务不会回滚。

    2. 如果在@Transactional注解中设置了rollbackFor属性,指定了需要回滚的异常类型,那么只有抛出指定的异常时,事务才会回滚。没有设置rollbackFor属性或者设置为空时,事务会在遇到非检查异常和错误时回滚。

    3. 如果在一个方法中捕获了异常,但没有再次抛出,或者在方法中手动调用了TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法,将事务标记为回滚状态,事务将不会回滚。

    4. @Transactional注解中设置了readOnly属性为true,表示当前事务为只读事务。如果在只读事务中发生了异常,事务不会回滚。

    5. 使用Propagation.NOT_SUPPORTED传播级别创建的事务,当在方法中发生异常时,事务不会回滚。

    请注意,在上述情况下,如果存在嵌套事务,并且外部事务需要回滚,那么内部事务也会被回滚。

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

    事务是用来保证数据库操作的一致性和数据的完整性的重要机制。在Spring框架中,事务回滚是指如果在事务执行过程中出现异常或者满足某些条件,事务将会回滚到之前的状态,即撤销已经执行的操作。

    然而,有些情况下Spring事务不会进行回滚,具体包括以下几点:

    1. 默认的运行时异常(RuntimeException):Spring事务管理默认只回滚RuntimeException及其子类异常,而不回滚受检查异常(CheckedException)或者错误(Error)异常。这意味着如果在事务中抛出的异常不是RuntimeException或其子类异常,事务将不会回滚。如果需要对其他类型的异常进行回滚,可以使用@Transactional注解的rollbackFor属性指定。

    2. 没有被事务管理的方法:事务只会对由Spring进行管理的方法起作用,如果在一个没有被@Transactional注解修饰的方法中发生异常,事务将不会回滚。

    3. 使用try-catch捕获了异常:如果在事务方法中使用try-catch语句捕获了异常并在catch块中进行了处理,将不会触发事务的回滚。这是因为捕获异常意味着我们已经对其进行了处理,将不再需要回滚事务。

    4. 事务方法外部调用:当一个事务方法通过另一个类的外部调用时,即在同一个类中的两个@Transactional方法之间相互调用,内部的方法调用并不会触发外部方法的事务回滚,除非内部方法自身抛出了异常。

    5. 不同数据库分布式事务:在分布式事务中,如果使用多个不同类型的数据库进行操作,有可能出现某些数据库无法支持事务的回滚操作。因此,需要将这些操作放在不同的事务中进行管理。

    总之,Spring事务只会在默认的运行时异常情况下回滚,其他情况需要根据具体需求进行配置。同时,需要注意在事务方法内部调用其他事务方法时,事务回滚的传递性以及分布式事务的处理。

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

    在Spring中,事务的回滚是默认行为。也就是说,如果在一个事务方法中发生了未捕获的异常,那么这个事务将会被回滚,数据库中的操作会被撤销。但是有一些特殊的情况下,事务不会被回滚。下面我将从几个方面介绍这些情况。

    1. 异常不是RuntimeException的子类
      默认情况下,Spring只会回滚RuntimeException的子类异常。如果在事务方法中抛出了一个非RuntimeException的异常,那么事务不会被回滚。这种情况下,需要在事务方法上添加rollbackFor属性,指定需要回滚的异常类型。

    示例代码如下:

    @Transactional(rollbackFor = Exception.class)
    public void transactionMethod() throws Exception {
        ...
        throw new Exception("Some Exception");
        ...
    }
    

    在上面的代码中,rollbackFor = Exception.class表示当抛出任何Exception类型的异常时,事务都会被回滚。

    1. 不在事务范围内的方法
      只有在有事务上下文的方法中,事务才会生效。如果一个方法没有被标记为@Transactional或者调用方法的类没有被标记为@Transactional,那么该方法将不会被包含在任何事务中,事务不会发生回滚。

    示例代码如下:

    @Component
    public class MyService {
        @Transactional
        public void transactionMethod() {
            ...
        }
    
        public void nonTransactionMethod() {
            ...
        }
    }
    

    在上面的代码中,transactionMethod()方法被标记为@Transactional,因此它在事务中。而nonTransactionMethod()方法没有被标记为@Transactional,所以它不在事务中。

    1. 手动提交事务
      在某些情况下,我们可能希望手动控制事务的提交和回滚。在这种情况下,事务将不会自动回滚,而是需要我们手动调用事务的回滚方法。

    示例代码如下:

    @Transactional
    public void transactionMethod() {
        ...
        if (shouldRollback) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        ...
    }
    

    在上面的代码中,shouldRollback变量是一个逻辑判断,根据它的值决定是否回滚事务。

    总之,在Spring中,事务的回滚是默认行为,但在一些特定的情况下,事务可能不会回滚。这时我们需要根据具体情况来调整事务的回滚策略。

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

400-800-1024

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

分享本页
返回顶部