A調用B方法,@Transactional事務失效情況

本人做了各種情況的測試,結果如下:
在這裏插入圖片描述

總結:
方法A調用方法B:
1、如果只有A加@Transactional註解;則AB在同一事務中;
2、如果只有B加@Transactional註解;AB方法爲同一類,事務失效;AB不同類,只有B有事務;

原理:
spring 在掃描bean的時候會掃描方法上是否包含@Transactional註解,如果包含,spring會爲這個bean動態地生成一個子類(即代理類,proxy),代理類是繼承原來那個bean的。
此時,當這個有註解的方法被調用的時候,實際上是由代理類來調用的,代理類在調用之前就會啓動transaction。然而,如果這個有註解的方法是被同一個類中的其他方法調用的,那麼該方法的調用並沒有通過代理類,而是直接通過原來的那個bean,所以就不會啓動transaction,我們看到的現象就是@Transactional註解無效。

那回到一開始的問題,我們調用的方法A不帶註解,因此代理類不開事務,而是直接調用目標對象的方法。當進入目標對象的方法後,執行的上下文已經變成目標對象本身了,因爲目標對象的代碼是我們自己寫的,和事務沒有半毛錢關係,此時你再調用帶註解的方法,照樣沒有事務,只是一個普通的方法調用而已。
簡單來說,內部調用本類方法,不會再走代理了,所以B的事務不起作用。

如果AB不同類,A調用的事代理類B,故B有事務。

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