面灵AI

招商银行应用开发秋招面经:异常传播与事务边界

时间
2026-09
来源
牛客网

《面试题目》

  1. JVM 怎样根据异常表寻找匹配的处理器?
  2. CompletableFuture 的异常怎样传播,异步阶段由哪个线程执行?
  3. ThreadLocal 为什么可能泄漏,线程池中有哪些上下文污染风险?
  4. 对象头和 Monitor 在 synchronized 中分别承担什么作用?
  5. AQS 怎样支持独占、共享和可中断获取?
  6. 线程池核心线程满后,为什么通常先排队而不是立即增加线程?
  7. Spring AOP 的同类内部调用为什么可能绕过增强?
  8. Around 切面怎样统计耗时而不改变返回值和异常行为?
  9. REQUIRES_NEW 与 NESTED 的事务边界有什么区别?
  10. 捕获内层异常后,为什么外层仍可能抛出 UnexpectedRollbackException?

《参考解析》

事务回滚标记

多个方法以 REQUIRED 参与同一事务时,内层失败可能让共享事务被标记为只能回滚。外层捕获异常不等于清除了标记,结束时仍无法提交。要先决定业务是否允许局部失败,再设计事务边界,不能只多套一层 try-catch。

两种传播方式

REQUIRES_NEW 使用独立事务,外层回滚不必然撤销已提交的内层事务;NESTED 通常在同一事务内使用保存点,外层最终回滚仍会撤销整体修改。后者能否使用取决于事务管理器和资源支持。

异步异常

把 CompletableFuture 返回给明确的等待方或连接错误处理阶段,否则任务失败可能没有进入预期的日志与告警链路。为阻塞 IO 指定合适的执行器,并在实际网络或数据库操作上设置超时;Future 标记超时并不自动终止所有底层工作。

耗时切面

用单调时间测量间隔,在 finally 中记录耗时,原返回值与异常原样传递。记录参数前先考虑敏感字段,切面自身的同步 IO 也不应变成主要开销。