【问题标题】:Spring @Transactional doesn't work for an annotated method when called from within service class从服务类中调用时,Spring @Transactional 不适用于带注释的方法
【发布时间】:2014-11-21 09:05:18
【问题描述】:

在下面的代码中,当从 methodOuter 中调用 methodInner() 时,应该在事务范围内。但事实并非如此。 但是当 methodInner() 直接从 MyController 类调用时,它是被事务绑定的。有什么解释吗?

这是控制器类。

@Controller
public class MyController {

    @Autowired
    @Qualifier("abcService")
    private MyService serviceObj;

    public void anymethod() {
        // below call cause exception from methodInner as no transaction exists  
        serviceObj.methodOuter(); 
    }

}

这是服务类

@Service("abcService")
public class MyService {

    public void methodOuter() {
        methodInner();
    }

    @Transactional
    public void methodInner() {
    .....
    //does db operation.
    .....
    }
}

【问题讨论】:

  • 您是否已将@EnableTransactionManagement 添加到您的配置中?
  • 按预期工作,因为这是代理的工作方式,仅拦截外部方法调用(即调用 INTO 对象),不拦截来自对象内部的调用。
  • stackoverflow.com/a/24902434/2504224@Async 替换为@Transactional,实际上您就有了答案
  • @Ludwig Magnusson :不,我没有使用 EnableTransactionManagement 。但我已将 放在 xml 配置文件中。我希望这就足够了。 Spring 能够在事务边界下执行其他方法。仅对于这种特殊情况,它不起作用。

标签: java spring spring-mvc spring-transactions


【解决方案1】:

Spring 默认使用 Java 代理来包装 bean 并实现带注释的行为。在服务中进行调用时,您会绕过代理并直接运行方法,因此不会触发带注释的行为。

可能的解决方案:

  1. 将所有 @Transactional 代码移动到单独的服务中,并始终从外部调用事务方法

  2. 使用 AspectJ 和编织来触发带注释的行为,即使在服务中也是如此

【讨论】:

    【解决方案2】:

    @Transactional 添加到methodOuter() 即可。

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 2018-02-23
      • 2011-03-10
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多