自定义异常继承 Exception,方法上只写了 @Transactional,异常一路抛到 Controller,事务却已经提交,脏数据留在表里。乍看像缓存或者权限的锅,追下去往往不是。

@Transactional(rollbackFor = Exception.class)
public void createOrder(Long id) throws BizException { ... }

追下去是这么回事:默认只对 RuntimeException 和 Error 回滚,受检异常被当成正常返回,事务管理器走到提交分支。

「rollbackFor 缺失」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,注解上补 rollbackFor = Exception.class;确认异常没有被上层 catch 掉;补一条抛受检异常的集成测试。

验收就看一点,抛出自定义异常后,订单表里查不到这次新增的记录。

作者 9823189