環境:
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並不能開啓事務的原因。