1、异常捕获处理自己处理了异常没有抛出Spring 事务回滚是由TransactionInterceptor在捕获到业务方法向外抛出的异常后触发的。如果在业务里try-catch把异常吃掉了、没有重新抛出拦截器就感知不到异常会走 commit 分支导致事务失效。以下是由于异常捕获处理导致的事务失效的场景与修复try-catch 完全吞掉异常try { doSomething(); } catch (Exception e) { log.error(转账失败, e); } // 拦截器看不到异常 → 提交应该修复为Transactional public void transfer(...) { try { doSomething(); } catch (Exception e) { log.error(转账失败, e); throw new BizException(转账失败, e); // 必须抛 } }2、抛出检查异常默认只回滚 RuntimeException运行时异常非受检异常受检异常需要配置rollbackFor Exception.class。受检查异常默认不回滚Transactional // 默认只回滚 RuntimeException / Error public void doSomething() throws IOException { throw new IOException(IO错误); // 受检异常默认不回滚 }应该修复为Transactional(rollbackFor Exception.class) // 显式指定 public void doSomething() throws IOException { throw new IOException(IO错误); }3、非 public 方法导致的事务失效Transactional只对public方法生效。如果标注在private、protected或包级default方法上Spring 会静默忽略该注解——不报错但方法完全没有事务能力。失效案例调用createOrder时数据照插异常照抛但事务从未开启。Service public class OrderService { Autowired private OrderMapper orderMapper; Transactional private void createOrder(Order order) { // ❌ private → 事务不生效 orderMapper.insert(order); // 抛异常也不会回滚 throw new RuntimeException(测试); } }解决方案直接把方法改为 publicTransactional public void createOrder(Order order) { orderMapper.insert(order); }