事務啓動bean的處理(Propagation.REQUIRES_NEW不生效的原因)

繼續進入

 

在創建代理對象時傳遞了目標對象taget,

在用cglib創建代理對象時,仍傳過去了target

最終返回的enhancer代理對象,如下圖示,仍含有目標對象taget實例(這就解釋了目標對象的自我調用 Propagation.REQUIRES_NEW 不會起作用的 )

首先調用的是AOP代理對象而不是目標對象,首先執行事務切面,事務切面內部通過TransactionInterceptor環繞增強進行事務的增強,即進入目標方法之前開啓事務,退出目標方法時提交/回滾事務。

目標對象內部的自我調用將無法實施切面中的增強。

借個圖(https://blog.csdn.net/hepei120/article/details/78058468?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase

è¿éåå¾çæè¿°

此處的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();

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章