直接上代碼
@Transactional
public void methodA() {
try {
methodB();
} catch (Exception e) {
e.printStackTrace();
}
CatalogEntity record = new CatalogEntity();
catalogEntityMapper.insert(record);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
CatalogEntity record = new CatalogEntity();
catalogEntityMapper.insert(record);
if (1 == 1) {
throw new RuntimeException("abc");
}
}
- 上面的代碼methodA、B都有聲明事務,但是在調用methodB時,是直接調用的目標方法,沒有經過AOP代理,所有B的事務是不生效的
- 如果需要B的事務生效,必須使用AOP代理的方式調用methodB,首先開啓暴露代理對象,aopContext能夠訪問@EnableAspectJAutoProxy(exposeProxy=true),然後修改代碼:
-
((TestService)AopContext.currentProxy()).methodB();
也可以通過BeanFactory裏面獲取TestService去調用methodB()
-
如果不太理解就自己寫JDK動態代碼去調用A,B方法