在下面的代码中,当从 methodOuter 中调用 methodInner() 时,应该在事务范围内。但事实并非如此。 但是当直接从 MyController 类调用 methodInner() 时,它受事务约束。有什么解释吗?
这是 Controller 类。
@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.
.....
}
}
最佳答案
Spring 默认使用 Java 代理来包装 bean 并实现带注释的行为。在服务中进行调用时,您会绕过代理并直接运行方法,因此不会触发带注释的行为。
可能的解决方案:
将所有
@Transactional
代码移到单独的服务中,并始终从外部调用事务方法即使在服务中也可以使用 AspectJ 和编织来触发带注释的行为
关于java - 从服务类中调用时,Spring @Transactional 不适用于带注释的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058100/