方法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有事務。
————————————————
原文鏈接:https://blog.csdn.net/weixin_36586564/article/details/105687331