@Transactional失效的幾種場景

1.一個有@Transactional的方法被沒有@Transactional方法調用時,會致使Transactional做用失效。也是最容易出現的狀況。this

  那爲啥會出現這種狀況?其實這仍是因爲使用Spring AOP代理形成的,由於只有當事務方法被當前類之外的代碼調用時,纔會由Spring生成的代理對象來管理。代理

2.對非public方法進行事務註解。@Transactional 將會失效。code

  緣由:是應爲在Spring AOP代理時,事務攔截器在目標方法先後進行攔截,DynamicAdvisedInterceptor的intercept 方法會獲取Transactional註解的事務配置信息,對象

由於在Spring AOP 代理時,如上圖所示 TransactionInterceptor (事務攔截器)在目標方法執行先後進行攔截, DynamicAdvisedInterceptor(CglibAopProxy 的內部類)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法會間接調用 AbstractFallbackTransactionAttributeSourcecomputeTransactionAttribute 方法會間接調用 AbstractFallbackTransactionAttributeSourcecomputeTransactionAttribute 方法,這個方法會獲取Transactional 註解的事務配置信息。他會首先校驗事務方法的修飾符是否是public,不是 public則不會獲取@Transactional 的屬性配置信息。
3.Transactional 事務配置屬性中的propagation 屬性配置的問題。
  當propagation屬性配置爲:
TransactionDefinition.PROPAGATION_SUPPORTS:若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。        TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,若是當前存在事務,則把當前事務掛起。     TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,若是當前存在事務,則拋出異常
 

4.還存在一種狀況:事務

  在一個類中A方法被事務註釋,B方法也被事務註釋。it

@ Transactionalio

 public void A(){sed

  try{配置

  this.B();方法

  }catch(Exception e){

    logger.error();

  }

 

}

但在執行B方法是報錯,可是異常被A catch 住,此時事務也會失效。

相關文章
相關標籤/搜索