Spring @Transactional注解在从服务类中调用的已注释方法中不起作用

5
在下面的代码中,当从methodOuter内部调用methodInner()时,应该处于事务边界之内。但实际上并没有。 但是,当直接从MyController类中调用methodInner()时,它会受到事务的限制。有什么解释吗? 这是控制器类。
@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 Class)

@Service("abcService")
public class MyService {

    public void methodOuter() {
        methodInner();
    }

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

你在配置中添加了 @EnableTransactionManagement 吗? - Ludwig Magnusson
2
按照代理的工作方式,这个程序表现正常,只有外部方法调用(即对象内部的调用)会被拦截,对象内部的调用不会被拦截。 - M. Deinum
1
@Async替换为@Transactional,你就得到了你的答案。 - geoand
@Ludwig Magnusson:不,我没有使用EnableTransactionManagement。但是我在XML配置文件中放置了tx:annotation-driven/。我希望这已经足够了。Spring能够在事务边界下执行其他方法。只有对于这种特殊情况它无法工作。 - cyrilantony
2个回答

6

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

可能的解决方案:

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

  2. 使用AspectJ和织入来触发服务内部的注释行为


0
@Transactional添加到methodOuter()中,它就能起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接