You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring事务疑问:同类调用时saveAmount1是否会随异常回滚?

Spring事务同对象方法调用下的回滚范围问题

场景代码

class UserService {
    
    @Transactional
    public void saveUsers() {
        saveUser1 to db;
        saveUser2 to db;
        saveAmount();
        saveUser3 to db;
    }
    
    public void saveAmount() {
        saveAmount1 to db;
        saveAmount2 to db; // 此处抛出异常
        saveAmount3 to db;
    }
}

已知前提

由于Spring AOP的代理机制,saveUsers()内部调用saveAmount()不会触发新的代理实例,两者共用同一个事务上下文。当saveAmount()中抛出异常时,saveUser1和saveUser2的操作会被回滚。

核心问题

saveAmount1是否会被回滚?

结论与分析

saveAmount1会被回滚,你的预期存在错误。

原因在于:同对象内方法调用确实不会触发Spring AOP的事务代理创建新事务,但整个流程完全处于saveUsers()开启的同一个事务中。Spring事务的回滚逻辑是基于整个事务上下文的——只要事务内发生未被捕获的、符合回滚规则的异常,事务管理器会撤销该事务中所有已执行的数据库操作,包括saveAmount1、saveUser1、saveUser2这些已经完成的操作。

如果你的本地复现出现saveAmount1未回滚的情况,需要排查以下可能:

  • 异常是否被saveAmount()或saveUsers()内部捕获并处理,导致事务管理器未检测到异常
  • @Transactional注解的rollbackFor/noRollbackFor属性是否配置了特殊规则,排除了当前异常类型的回滚
  • 数据库本身是否不支持事务(比如使用MyISAM引擎的MySQL)

内容的提问来源于stack exchange,提问作者Shubham Palkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:38:21