Spring Boot笔记
2018-12-05 本文已影响0人
凌风x
时间:2018.12.05
记录一些spring和spring boot中的一些常见技巧或隐藏问题
1.@transactional注解隐藏的问题
@Transactional//事务A
public boolean action_A(){
action_B();//调用事务B
return false;
}
@Transactional//事务B
public boolean action_B(){
return false;
}
在一个事务中直接调用另一个事务,此时事务便会失效。
原因:由于事务是基于spring AOP 操作的,而AOP又是基于动态代理实现。而动态代理的实现就要求,每次调用方法必须通过代理调用方法,而不能直接调用方法。如果直接调用方法,那么AOP的各种特性也就消失了。
解决方法:
第一步: 修改spring配置文件XML增加语句(先开启cglib代理,然后开启exposeProxy=true ,向外暴露代理对象):
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true">
第二步:使用ApoContext获取对象的动态代理
AopContext.currentProxy();
完整代码:
public class TempImpl implements TempInterface{
@Transactional//事务A
@Override
public boolean action_A(){
TempInterface tempInterface=(TempInterface)AopContext.currentProxy();//获取当前动态代理
tempInterface.action_B();//调用事务B
return false;
}
@Transactional//事务B
@Override
public boolean action_B(){
return false;
}
}
至此解决