spring事物在什么时候回滚
-
Spring事务回滚的时机主要取决于以下几个因素:
-
抛出未捕获的异常:当在事务内抛出未捕获的异常时,Spring会自动触发事务回滚。这意味着所有在该事务内进行的数据库操作都会被撤销,回滚到事务开始前的状态。
-
标记事务回滚:在方法上使用@Transactional注解时,可以通过设置rollbackFor属性来标记在哪些异常发生时触发事务回滚。例如,@Transactional(rollbackFor = {SQLException.class, NullPointerException.class})表示当发生SQLException或NullPointerException时,事务会被回滚。
-
未捕获的运行时异常:如果在事务内发生未捕获的运行时异常(即继承自RuntimeException的异常),事务将会回滚。
-
Checked异常转化为未检查异常:如果在事务内发生了将Checked异常转化为未检查异常的操作,事务也会回滚。这是因为Spring默认将未检查异常视为触发事务回滚的信号。
-
配置文件声明:可以通过配置文件的方式声明哪些异常时触发事务回滚的。这种方式较少使用,一般推荐使用注解的方式来管理事务。
需要注意的是,事务的回滚只会对当前线程的事务起作用,不会影响其他线程的事务。另外,Spring事务管理在默认情况下,对非运行时异常(Checked异常)不会触发事务回滚,如果需要回滚这些异常,可以通过配置rollbackFor属性或指定rollbackOn属性来实现。
综上所述,Spring事务的回滚时机主要取决于抛出的异常类型和配置的回滚条件。根据不同的业务需求,可以灵活地设置事务回滚的条件,以保证数据的一致性和完整性。
1年前 -
-
Spring事务在以下情况下会回滚:
-
运行时异常:当事务方法抛出未检查异常(RuntimeException及其子类)时,事务会回滚。这包括NullPointerException、ArrayIndexOutOfBoundsException等运行时异常。
-
受检查异常:当事务方法抛出已检查异常(Exception及其子类)时,事务不会回滚,除非将其标记为回滚异常。可以使用
@Transactional(rollbackFor = Exception.class)注解将特定的已检查异常标记为回滚异常。 -
Error:当事务方法抛出Error类型的错误时,事务会回滚。这是一种严重的错误,一般无法恢复。
-
事务回滚异常:当事务方法抛出继承自
RuntimeException的子类异常或Error类型的错误时,事务将直接回滚。可以使用@Transactional(rollbackFor = {MyException.class, MyError.class})注解将指定的异常或错误标记为回滚异常。 -
标记为回滚的异常:通过
@Transactional注解的rollbackFor属性或rollbackForClassName属性,可以将特定的异常标记为回滚异常。只有在抛出标记为回滚的异常时,事务才会回滚。
需要注意的是,Spring的事务回滚是基于方法级别的,即当事务方法执行期间出现以上情况时,事务会回滚。如果事务方法调用了其他事务方法,当其中某个事务方法发生回滚时,并不会导致整个调用链的回滚。因此,如果需要整个调用链都回滚,可以在外层事务方法中将内部事务方法调用包装在同一个事务中。可以使用
@Transactional(propagation = Propagation.REQUIRED)注解设置外层方法的事务传播属性为REQUIRED。1年前 -
-
Spring事务在以下情况下会回滚:
-
运行时异常:如果在事务方法中抛出了未被捕获的运行时异常(继承自 RuntimeException),Spring会自动回滚事务。例如,如果在事务方法中发生了空指针异常,事务就会回滚。
-
标记为回滚的异常:可以通过在抛出的异常类或方法上标记
@Transactional(rollbackFor = Exception.class)注解来指定异常触发事务回滚。在这种情况下,只有抛出的异常是被指定的异常类型或其子类型时,事务才会回滚。 -
手动回滚:在事务方法中,可以通过调用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()来手动回滚事务。这通常是在某些特定的业务逻辑条件下,根据需要手动触发事务回滚。 -
未被捕获的受检查异常:如果在事务方法中抛出了未被捕获的受检查异常,事务将回滚。但是,通常情况下,受检查异常应该在方法内进行捕获和处理,而不应该让它们逃离方法范围以触发事务回滚。
需要注意的是,默认情况下,Spring事务只会在抛出RuntimeException及其子类型的异常时回滚。如果需要在抛出受检查异常时也回滚事务,可以通过在
@Transactional注解上使用rollbackFor属性来指定回滚的异常类型,如@Transactional(rollbackFor = {Exception.class})。在基于注解的事务管理中,事务管理器会拦截带有
@Transactional注解的方法,根据异常的类型决定是否回滚事务。如果事务回滚成功,则会将事务标记为回滚状态,并将异常抛出给调用者。调用者可以选择处理该异常或继续将其传播给上层调用者。总结起来,Spring事务回滚的情况包括运行时异常、标记为回滚的异常、手动回滚和未被捕获的受检查异常。在使用Spring事务时,应根据业务需求和异常情况来合理处理事务回滚。
1年前 -