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
相关产品推荐
相关产品推荐

