在下面的代码中,当从 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.
.....
}
}
答案 0 :(得分:4)
Spring默认使用Java代理来包装bean并实现带注释的行为。在服务中进行调用时,您可以直接绕过代理和运行方法,因此不会触发带注释的行为。
可能的解决方案:
将所有@Transactional
代码移至单独的服务,并始终从外部调用事务方法
使用AspectJ和编织即使在服务中也能触发注释行为
答案 1 :(得分:0)
将@Transactional
添加到methodOuter()
,然后就可以了。