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

cyr*_*ony 5 java spring spring-mvc spring-transactions

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

}
Run Code Online (Sandbox Code Playgroud)

这是服务等级

@Service("abcService")
public class MyService {

    public void methodOuter() {
        methodInner();
    }

    @Transactional
    public void methodInner() {
    .....
    //does db operation.
    .....
    }
}
Run Code Online (Sandbox Code Playgroud)

hoa*_*oaz 6

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

可能的解决方案:

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

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