spring aop 什么时候会回滚
-
Spring AOP会在以下情况下回滚:
-
默认的事务回滚条件:当方法抛出未被捕获的异常时,Spring AOP会将当前事务回滚。这包括所有继承自RuntimeException的异常以及Error异常。
-
指定的回滚条件:可以使用@Transactional注解来指定事务的回滚条件。通过设置rollbackFor属性,可以指定需要回滚的异常类型。例如,@Transacational(rollbackFor= {SQLException.class,RuntimeException.class}),这样当方法抛出SQLException或RuntimeException时,会触发事务的回滚。
-
自定义的回滚条件:通过编程方式,在代码中自定义回滚条件。可以使用TransactionAspectSupport.currentTransactionStatus()方法获取当前的事务状态,然后根据自定义的条件来判断是否回滚事务。
需要注意的是,Spring AOP只会回滚被@Transactional注解修饰的方法。如果方法内部调用了其他被@Transactional注解修饰的方法,那么只有外部方法发生异常时,事务才会回滚。
总而言之,Spring AOP会在方法抛出未被捕获的异常时,或者满足指定的回滚条件时,将当前事务进行回滚操作。
1年前 -
-
Spring AOP 在以下情况下会进行回滚:
-
异常触发回滚:当被通知的方法抛出了异常时,Spring AOP 默认会触发回滚操作。这是最常见的回滚情况,Spring 提供了一系列的异常类用于控制回滚操作,如
RuntimeException、Error以及它们的子类等。 -
标记为回滚:可以使用
@Transactional注解的rollbackFor、noRollbackFor属性来标记异常类,当方法抛出被标记的异常时,会触发回滚操作。
@Transactional(rollbackFor = {CustomException.class})-
异常未被捕获:如果方法内部抛出了异常,但该异常在方法内部被捕获并处理了,那么回滚操作将不会发生。只有当异常未被捕获,或者被捕获后重新抛出时,回滚操作才会被触发。
-
异常传播:当一个方法调用另一个带有事务的方法时,如果被调用的方法内部抛出了异常,如果事务传播行为设置为
REQUIRED,那么整个事务将会回滚。 -
手动回滚:通过
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法可以手动将当前事务设置为回滚状态。
总结:Spring AOP 在方法抛出异常、事务传播失败、手动回滚等情况下会触发回滚操作。可以通过注解的方式或手动控制来定义回滚的条件。
1年前 -
-
Spring AOP可以在方法执行过程中实现事务的回滚。事务是一组操作,要么全部成功执行,要么全部回滚到事务开始前的状态。在Spring中,可以使用@Transactional注解来标记事务方法,该注解将方法标记为事务,并定义了回滚条件。
Spring AOP中的事务回滚可以在以下情况下发生:
- 异常抛出:当一个被@Transactional注解标记的方法抛出一个未捕获的异常时,Spring将回滚事务。默认情况下,Spring只会在遇到RuntimeException及其子类异常时回滚事务。如果要在遇到其他异常时也回滚事务,可以通过设置rollbackFor属性来指定。
例如:
@Transactional(rollbackFor = Exception.class) public void saveData(Data data) { // 保存数据的操作 // 如果抛出异常,事务将回滚 }-
运行时异常:如果在事务方法中抛出了一个RuntimeException或其子类异常,Spring将回滚事务。
-
非检查异常:非检查异常是继承自RuntimeException的异常。如果在事务方法中抛出了一个非检查异常,Spring将回滚事务。
-
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年前