繼續進入
在創建代理對象時傳遞了目標對象taget,
在用cglib創建代理對象時,仍傳過去了target
最終返回的enhancer代理對象,如下圖示,仍含有目標對象taget實例(這就解釋了目標對象的自我調用 Propagation.REQUIRES_NEW 不會起作用的 )
首先調用的是AOP代理對象而不是目標對象,首先執行事務切面,事務切面內部通過TransactionInterceptor環繞增強進行事務的增強,即進入目標方法之前開啓事務,退出目標方法時提交/回滾事務。
目標對象內部的自我調用將無法實施切面中的增強。
此處的this指向目標對象,因此調用this.b()將不會執行b事務切面,即不會執行事務增強,因此b方法的事務定義“@Transactional(propagation = Propagation.REQUIRES_NEW)”將不會實施
解決方法
1:不要做內部調用 ,用a,b方法用倆個類分開寫,不要寫在同一個類裏
2,或者在類內部autoweired自己,A{
autowired A a;
@Transactional(propagation = Propagation.REQUIRED)
m1()
{
a.m2();//這樣也會使REQUIRES_NEW生效
};
@Transactional(propagation = Propagation.REQUIRES_NEW)
m2();
}