spring事务什么时候回滚
-
Spring事务在什么情况下会回滚?
Spring框架是一个用于开发企业级Java应用的框架,它提供了一种声明式事务管理的方式。事务是一组原子操作的集合,要么全部成功完成,要么全部失败回滚。Spring事务的回滚机制主要是通过设置事务的属性来实现的,具体回滚的情况如下:
一、运行时异常(RuntimeException)或者其子类的抛出:当一个运行时异常抛出时,默认情况下,Spring会回滚事务。运行时异常通常是程序中发生的错误或异常情况,比如空指针异常、数组越界异常等。Spring事务管理器会捕获这些异常,并将事务回滚到最初的状态。
二、标记为回滚的异常(RollbackException)的抛出:在某些情况下,我们可以标记特定的异常为回滚异常。当这些异常发生时,Spring会回滚事务。通过在方法上使用
@Transactional(rollbackFor = {RollbackException.class})注解,我们可以指定特定的异常触发事务的回滚。三、非运行时异常(非RuntimeException)的抛出,默认情况下,Spring不会回滚事务。这是因为非运行时异常通常是由程序员主动抛出的,用于处理特定的业务逻辑。如果我们希望在非运行时异常发生时回滚事务,可以通过在方法上使用
@Transactional(rollbackFor = {Exception.class})注解,指定回滚所有的异常。四、事务超时:当事务的执行时间超过了指定的超时时间时,Spring会回滚事务。超时时间可以通过
@Transactional(timeout = 60)注解指定,单位是秒。五、手动回滚:在某些特殊情况下,我们可能需要手动回滚事务。我们可以通过调用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法来手动回滚事务。需要注意的是,以上这些回滚情况适用于运行在Spring事务管理器下的数据库事务,对于其他类型的事务(如消息队列、文件操作等),需要根据具体的情况进行配置。另外,事务的回滚还受到事务管理器的具体实现方式和配置的影响,比如使用JDBC事务管理器、JTA事务管理器等。
总之,Spring事务的回滚是通过配置事务属性或手动设置回滚标记实现的,具体的回滚情况可以根据业务需求来定制。
1年前 -
-
当事务中的任何操作发生异常时,Spring会自动将事务回滚。这包括数据库操作失败、网络连接中断或其他任何导致事务无法继续执行的异常情况。回滚会撤消事务中的所有操作,使数据恢复到事务开始前的状态。
-
当前的事务方法被标记为回滚异常时,Spring会在方法抛出异常后回滚事务。可以通过在方法上添加
@Transactional(rollbackFor = Exception.class)注解或指定rollbackFor属性的方式来将某个特定的异常标记为回滚异常。 -
当事务方法抛出非回滚异常时,默认情况下Spring不会自动回滚事务。非回滚异常是指
RuntimeException及其子类,例如NullPointerException、IllegalArgumentException等。如果希望将某个非回滚异常也标记为回滚异常,可以通过在方法上添加@Transactional(rollbackFor = {Exception.class, NonRollbackException.class})注解或指定rollbackFor属性的方式来实现。 -
在同一个事务中嵌套调用其他带有事务的方法时,默认情况下Spring不会回滚嵌套调用的方法。只有当嵌套调用的方法自身发生异常时,才会导致嵌套调用的事务回滚。如果希望嵌套调用方法也能够回滚,可以通过在方法上添加
@Transactional(propagation = Propagation.REQUIRES_NEW)注解或指定propagation属性的方式来实现。 -
在声明式事务中,如果调用其他类中的事务方法,子方法发生异常时,默认情况下Spring不会自动回滚事务。只有当子方法抛出异常时,事务才会回滚。如果希望将异常传播到调用方并回滚事务,可以使用
Propagation.REQUIRED_NEW传播机制,将调用方法和被调用方法都设置为独立的事务。这样遇到异常时,子方法的事务会回滚,同时也会回滚调用方法的事务。
1年前 -
-
Spring事务在以下情况下会进行回滚:
-
默认情况下,当抛出RuntimeException或其子类异常的时候,Spring事务会进行回滚。这意味着,如果在被@Transactional注解的方法中抛出了RuntimeException或其子类异常,事务将会回滚。相反,如果抛出的是非RuntimeException异常,Spring事务将不会进行回滚。
-
手动回滚。在方法中可以通过调用TransactionStatus对象的setRollbackOnly()方法来手动设置事务回滚。当调用该方法后,无论方法正常返回还是抛出异常,事务都会回滚。
-
异常的传播行为。在Spring中,事务的传播行为可以指定当一个事务方法被另一个事务方法调用时,事务应该如何进行传播。当使用嵌套事务传播行为时,如果内部事务抛出异常并被外部事务捕获,则只会回滚内部事务而不会回滚外部事务。相反,如果内部事务抛出异常并被上层事务未捕获,则会回滚所有的事务。
-
注解的rollbackFor属性。通过在@Transactional注解中使用rollbackFor属性,可以指定特定的异常类型,在遇到这些异常时事务会进行回滚。例如,@Transactional(rollbackFor = {CustomException.class})表示当遇到CustomException及其子类异常时,事务将会回滚。
1年前 -