1、在同一類方法間相互調用,如果調用方無事務控制,被調用方有事務控制,則被調用方也無事務
原因:外部經過spring容器調用service的方法事務才生效,service類內部方法間相互調用事務不生效,也就是傳說中的自調用失效問題。主要原因是 Spring數據庫事務的約定,其實現原理是AOP,而AOP的原理是動態代理,在自調用的過程中,是類自身的調用,而不是代理對象去調用,那么就不會產生AOP,這樣 Spring就不能把你的代碼織入到約定的流程中,於是就產生了現在看到的失敗場景。
2、默認事務傳遞性)事務控制A調用事務控制B,如果B拋異常,A處理異常,則整個事務會回滾,同時報錯Transaction rolled back because it has been arked as rollback-only
如圖所示:箭頭表示的2個方法都有事務,外面的事務捕獲了里面的事務
原因:事務的傳遞性,因為A調用B,所以A和B都是同一個事務對象,B使用A的事務對象,成為一個整理,B拋異常已經將事務對象設值為需回滾狀態(RollbackOnly)了,除非B中直接處理異常,當外層事務處理異常想提交整個事務時,出現異常Transaction rolled back because it has been arked as rollback-only
3、事務控制的方法中異步線是沒有事務控制的