Spring爲什麼使用this調用需開啓事務的方法(本類對象方法),事務並不生效

環境:

      Springboot:2.2.3.RELEASE

      Spring:5.2.3.RELEASE

驗證完事務傳播的7大機制,想起來曾經遇到的一個問題,關於事務不生效的問題。

大致情況如下:

Controller調用Service,Service調用本類對象一個帶事務的方法,結果事務並不生效。

問題分析:

首先分析事務管理的本質是什麼,Aop!關鍵是代理對象!this關鍵字一般來說表明的是本類對象,如果在Service中確實是使用了非代理對象訪問帶事務的方法,那麼事務不生效其實是因爲不符合Aop,換言之就是普通的對象調用本類方法,跟事物也就沒什麼關係了。驗證一下:

可以看到的是Controller層的this確實是本類對象,transService自動注入的是代理對象。

進到Service中看一下

確實,調用僅僅是普通的調用,使用代理對象調用試一下:

獲取代理對象(注意SpringCGLIB實際是動態生成其子類,基於子類的動態代理)

順便進去看看Method.invoke()

這也就說明了,爲什麼使用this並不能開啓事務的原因。

 

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