Spring事務嵌套引發的異常: Transaction rolled back because it has been marked as rollback-only

spring的@Transactional 可以註解到方法上或者類上,並且只有在 該類被作爲spring容器託管的bean的時候,也就是使用@autowird 被注入到其他類中使用,調用該類的方法的時候才生效

因爲此時調用方法會被spring容器的 TransactionInterceptor 攔截器攔截,並開啓事務

如果是同一個類中的方法 調用 第二個方法 即this.方法 ,第二個方法的事務 是不起作用的,這種情況沒有 mark-as roll異常

出現marked as rollback-only異常,是因爲使用默認的@Transactional 註解,事務的傳播性默認爲Propagation.REQUIRED,調用其他類的 事務方法addPerson(user);

這個方法開啓的事務是默認Propagation.REQUIRED,也就是沿用外層調用方法的事務 (如果有事務存在 則使用原事務 如果不存在則開啓新事務)

外層方法開啓了一個事務,內層方法調用的是其他類的事務方法,內層方法發現異常了,會標記整個事務爲roll-back,但是外層方法捕獲異常 return的時候 會執行commit事務 但是此時發現已經標記異常,所以纔會拋出異常

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