面试题答案
一键面试异常传播路径
- 方法调用栈:当服务方法抛出异常时,异常会沿着方法调用栈向上传播,从抛出异常的方法开始,依次经过调用它的上层方法,直到被捕获或者到达应用程序的顶层(例如,Spring MVC的Controller层被全局异常处理器捕获)。
不同类型异常对事务回滚的影响
- 运行时异常(RuntimeException及其子类):默认情况下,Spring事务管理机制会自动回滚由运行时异常导致的事务。这是因为运行时异常通常表示程序逻辑错误,例如
NullPointerException
、IllegalArgumentException
等,这种情况下事务的完整性已无法保证,回滚事务是合理的操作。 - 检查型异常(非RuntimeException的异常):默认情况下,Spring事务管理机制不会自动回滚由检查型异常导致的事务。检查型异常一般用于表示可恢复的错误,例如
IOException
、SQLException
等,应用程序通常期望在捕获这类异常后进行特定的处理,而不是直接回滚事务。
控制事务回滚条件的配置
- 基于注解方式:
- 在服务方法上使用
@Transactional
注解,通过rollbackFor
属性指定需要回滚的异常类型。例如:
- 在服务方法上使用
@Transactional(rollbackFor = {IOException.class, SQLException.class})
public void someServiceMethod() throws IOException, SQLException {
// 业务逻辑
}
- 通过`noRollbackFor`属性指定不需要回滚的异常类型。例如:
@Transactional(noRollbackFor = {MyCustomException.class})
public void someServiceMethod() throws MyCustomException {
// 业务逻辑
}
- 基于XML配置方式:
- 在Spring配置文件中定义事务管理器,并配置
<tx:advice>
标签。例如:
- 在Spring配置文件中定义事务管理器,并配置
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="IOException,SQLException" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
- 同样,可以使用`no-rollback-for`属性来指定不需要回滚的异常类型。
通过上述方式,可以灵活地控制Spring应用中事务回滚的条件。