在下面的代码中,当methodInner()从methodOuter内部调用时,应该处于事务边界之下。但事实并非如此。但是,当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.
.....
}
}发布于 2014-09-26 11:18:19
Spring默认使用Java代理来包装bean并实现带注释的行为。在服务中执行调用时,您可以绕过代理并直接运行方法,因此不会触发带注释的行为。
可能的解决办法:
@Transactional代码移动到单独的服务,并始终从外部调用事务性方法https://stackoverflow.com/questions/26058100
复制相似问题