是因为在默认情况下,Spring只会在遇到未检查异常(RuntimeException及其子类)时才会回滚事务,而对于已检查异常(Exception及其子类)则不会回滚事务。
这种行为是为了避免误回滚,因为已检查异常通常是可以被捕获和处理的,而未检查异常通常是由于程序错误或系统故障引起的,需要回滚事务来保证数据的一致性。
如果希望在遇到已检查异常时也回滚事务,可以通过在事务注解上添加rollbackFor
属性来指定需要回滚的异常类型,例如:
@Transactional(rollbackFor = Exception.class)
public void someMethod() {
// 业务逻辑代码
}
这样,当someMethod
方法中抛出任何异常时,都会触发事务回滚。
另外,Spring还提供了noRollbackFor
属性,用于指定不需要回滚的异常类型,例如:
@Transactional(noRollbackFor = BusinessException.class)
public void someMethod() {
// 业务逻辑代码
}
这样,当someMethod
方法中抛出BusinessException
异常时,事务不会回滚。
总结起来,Spring事务在异常后不回滚的原因是默认只回滚未检查异常,可以通过rollbackFor
属性来指定需要回滚的异常类型,或使用noRollbackFor
属性来指定不需要回滚的异常类型。
领取专属 10元无门槛券
手把手带您无忧上云