同一個類中事務嵌套問題

同一個類中“方法1”調用有事務的“方法2”不起作用

解決辦法:把註解放到類上就可以了
原因:Spring採用動態代理(AOP)實現對bean的管理和切片,它爲我們的每個class生成一個代理對象。只有在代理對象之間進行調用時,可以觸發切面邏輯。而在同一個class中,方法B調用方法A,調用的是原對象的方法,而不通過代理對象。所以Spring無法切到這次調用,也就無法通過註解保證事務性了。

“子方法”回滾讓“父方法”不回滾

背景:由於Springboot中默認是PROPAGATION_REQUIRED,也就說“子方法”會使用"父方法"的事務,這樣當“子方法”拋出異常,被"父方法"的事務捕獲,就會認爲是"父方法"整個方法異常了,就會事務回滾,也就造成了2個方法都沒有插入進去數據。
解決辦法:在“子方法”加 @Transactional(propagation = Propagation.REQUIRES_NEW)

注:

如下幾個表示傳播行爲的常量:
PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。
PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作爲當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於PROPAGATION_REQUIRED。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章