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)
Spring 默认使用 Java 代理来包装 bean 并实现带注释的行为。在服务内进行调用时,您会绕过代理并直接运行方法,因此不会触发带注释的行为。
可能的解决方案:
将所有@Transactional代码移至单独的服务,并始终从外部调用事务方法
使用 AspectJ 和编织来触发带注释的行为,即使在服务中也是如此
| 归档时间: |
|
| 查看次数: |
2677 次 |
| 最近记录: |