同一個類中“方法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。