spring aop 什么时候会回滚

worktile 其他 45

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring AOP会在以下情况下回滚:

    1. 默认的事务回滚条件:当方法抛出未被捕获的异常时,Spring AOP会将当前事务回滚。这包括所有继承自RuntimeException的异常以及Error异常。

    2. 指定的回滚条件:可以使用@Transactional注解来指定事务的回滚条件。通过设置rollbackFor属性,可以指定需要回滚的异常类型。例如,@Transacational(rollbackFor= {SQLException.class,RuntimeException.class}),这样当方法抛出SQLException或RuntimeException时,会触发事务的回滚。

    3. 自定义的回滚条件:通过编程方式,在代码中自定义回滚条件。可以使用TransactionAspectSupport.currentTransactionStatus()方法获取当前的事务状态,然后根据自定义的条件来判断是否回滚事务。

    需要注意的是,Spring AOP只会回滚被@Transactional注解修饰的方法。如果方法内部调用了其他被@Transactional注解修饰的方法,那么只有外部方法发生异常时,事务才会回滚。

    总而言之,Spring AOP会在方法抛出未被捕获的异常时,或者满足指定的回滚条件时,将当前事务进行回滚操作。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring AOP 在以下情况下会进行回滚:

    1. 异常触发回滚:当被通知的方法抛出了异常时,Spring AOP 默认会触发回滚操作。这是最常见的回滚情况,Spring 提供了一系列的异常类用于控制回滚操作,如RuntimeExceptionError以及它们的子类等。

    2. 标记为回滚:可以使用@Transactional注解的rollbackFornoRollbackFor属性来标记异常类,当方法抛出被标记的异常时,会触发回滚操作。

    @Transactional(rollbackFor = {CustomException.class})
    
    1. 异常未被捕获:如果方法内部抛出了异常,但该异常在方法内部被捕获并处理了,那么回滚操作将不会发生。只有当异常未被捕获,或者被捕获后重新抛出时,回滚操作才会被触发。

    2. 异常传播:当一个方法调用另一个带有事务的方法时,如果被调用的方法内部抛出了异常,如果事务传播行为设置为REQUIRED,那么整个事务将会回滚。

    3. 手动回滚:通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法可以手动将当前事务设置为回滚状态。

    总结:Spring AOP 在方法抛出异常、事务传播失败、手动回滚等情况下会触发回滚操作。可以通过注解的方式或手动控制来定义回滚的条件。

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

    Spring AOP可以在方法执行过程中实现事务的回滚。事务是一组操作,要么全部成功执行,要么全部回滚到事务开始前的状态。在Spring中,可以使用@Transactional注解来标记事务方法,该注解将方法标记为事务,并定义了回滚条件。

    Spring AOP中的事务回滚可以在以下情况下发生:

    1. 异常抛出:当一个被@Transactional注解标记的方法抛出一个未捕获的异常时,Spring将回滚事务。默认情况下,Spring只会在遇到RuntimeException及其子类异常时回滚事务。如果要在遇到其他异常时也回滚事务,可以通过设置rollbackFor属性来指定。

    例如:

    @Transactional(rollbackFor = Exception.class)
    public void saveData(Data data) {
        // 保存数据的操作
        // 如果抛出异常,事务将回滚
    }
    
    1. 运行时异常:如果在事务方法中抛出了一个RuntimeException或其子类异常,Spring将回滚事务。

    2. 非检查异常:非检查异常是继承自RuntimeException的异常。如果在事务方法中抛出了一个非检查异常,Spring将回滚事务。

    3. Error:如果事务方法抛出了一个Error异常,Spring将回滚事务。

    另外,Spring可以根据方法的返回值来判断是否回滚事务。如果方法的返回值是void或者null,Spring将回滚事务。否则,Spring不回滚事务。

    在使用AspectJ注解或XML配置方式进行AOP编程时,可以通过配置事务拦截器来确定何时回滚事务。可以使用以下示例代码来配置事务拦截器:

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
        
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" rollback-for="Exception"/>
            <tx:method name="update*" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example..*Service.*(..))"/>
    </aop:config>
    

    以上配置中,txAdvice是事务通知,transactionManager是事务管理器。tx:method元素定义了哪些方法需要启用事务,rollback-for属性指定了遇到哪些异常时回滚事务。aop:advisor元素指定了哪些方法需要应用事务通知。

    总之,Spring AOP会在方法执行过程中根据配置的事务规则判断是否回滚事务。通常情况下,遇到RuntimeException及其子类异常时,Spring会自动回滚事务。如果需要在其他异常或特定条件下进行事务回滚,可以通过配置进行定制。

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

400-800-1024

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

分享本页
返回顶部