明明 catch 了异常,下单还是全回滚:UnexpectedRollbackException 是怎么来的
引言 3 月压测第二天,下单成功率从 99.2% 掉到 87.3%,一天 2,136 单创建失败。 报错不是"库存不足",也不是"锁超时",而是一个很多人第一次见的异常: org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only (Spring 6.x 的提示语;5.x 是 Transaction rolled back because it has been marked as rollback-only,意思一样。) 更让人看不懂的是代码:发积分那段明明包在 try-catch 里,异常被吞了,主流程还打了一行 log.warn("add points failed, continue")。日志确实打出来了,说明 catch 生效;但事务最后还是回滚了,订单没建成。 先给结论:catch 能拦住异常往外抛,拦不住内层事务已经把你标记成 rollback-only。 ....