Spring中调用带@Transactional注解的方法的外层方法是否需要加事务?
首先明确Spring声明式事务的核心生效规则:
@Transactional基于AOP动态代理实现,只有public方法被外部类调用时,注解才会生效。- 类内部用
this调用本类方法、给private方法加@Transactional,这两种场景下事务注解都会直接失效。
你当前贴的代码本身存在逻辑问题:methodA是private方法,且你是在本类的methodB里用this.methodA()调用,不管你给methodA加不加@Transactional,这段DB操作都不会被事务管理,等于注解完全不生效。
接下来针对你的两个问题给出明确结论:
1. methodB是否需要添加@Transactional注解?
如果你需要这段DB操作有事务保障,有两种可行方案:
- 方案一:给public的
methodB加@Transactional注解,事务会正常生效,作用范围是整个methodB的执行周期。 - 方案二:把
methodA改成public,然后在当前类里注入自身实例(比如用@Autowired注入本类对象),用注入的实例调用methodA,这样methodA上的@Transactional才会生效。
2. 不为methodB添加事务注解,是否能够缩短事务的持续时长?
你当前的写法本身没有生效的事务,不存在事务时长的说法。如果按照上述正确的事务生效方案对比:
- 如果你选方案二,只给
methodA配置生效的事务,事务只会在methodA执行时开启,执行完就提交,事务时长仅包含methodA内部的DB操作耗时,methodB前后的非DB操作不会被计入事务,整体事务更短。 - 如果你给
methodB加事务,事务会覆盖整个methodB的执行周期,包括前后不需要DB操作的逻辑,事务持续时间会更长。
内容的提问来源于stack exchange,提问作者Paul Serre
相关产品推荐
相关产品推荐

