場景
一個類中有兩個方法,分別是A 和 B,方法A調用方法B,方法B有事務註解,方法A沒有事務註解,當發生異常是,沒有回滾。
直接看代碼,更直觀
測試用例
結論
方法B雖然已經有事務註解,但是並不會回滾。
底層原因
Spring採用動態代理(AOP)實現對bean的管理和切片,每個class生成一個代理對象。只有在代理對象之間進行調用時,可以觸發切面邏輯。而在同一個class中,方法A調用方法B,調用的是原對象的方法,而不通過代理對象。所以Spring無法切到這次調用,也就無法通過註解保證事務性了。
解決方案
同一個類中需要事務的方法都加上事務註解。
閱讀更多 碼向未來 的文章