从服务类中调用时,Spring @Transactional不适用于带注释的方法

时间:2014-09-26 11:04:39

标签: java spring spring-mvc spring-transactions

在下面的代码中,当从 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.
    .....
    }
}

2 个答案:

答案 0 :(得分:4)

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

可能的解决方案:

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

  2. 使用AspectJ和编织即使在服务中也能触发注释行为

答案 1 :(得分:0)

@Transactional添加到methodOuter(),然后就可以了。