贝利信息

Java面试——Spring事务失效的几种场景

日期:2026-01-07 00:00 / 作者:月夜之吻
@Transactional在private方法上不生效,因Spring事务基于代理机制,仅public方法可被AOP拦截;private方法调用绕过代理,事务逻辑无法织入。

为什么@Transactional在private方法上不生效

Spring事务基于代理机制,只有被代理对象的public方法才能被AOP拦截并织入事务逻辑。private方法无法被代理调用,即使加了@Transactional注解,也完全不会触发事务管理器。

同一类中this调用导致事务失效

当一个@Service类里,methodA()(带@Transactional)调用本类的methodB()(也带@Transactional),实际执行的是this.methodB()——走的是原始对象调用,绕过了代理对象,事务不会传播。

RuntimeException之外的异常未配置rollbackFor

Spring默认只对RuntimeException及其子类、Error触发回滚。如果业务抛出的是Exception(比如IOException、自定义检查异常),且没显式配置rollbackFor,事务会正常提交。

数据库引擎不支

持事务或事务已提交

事务失效有时和Spring无关,而是底层环境问题。最典型的是MySQL表使用MyISAM引擎——它根本不支持事务,无论注解怎么写都无效。

事务失效往往不是单一原因,而是代理机制、异常策略、数据库配置、传播行为四者交织的结果。最容易被忽略的是“自己调自己”和“引擎不支持”这两点——前者在本地测试时可能恰好不暴露问题,后者在线上环境才突然爆发。