1.一個有@Transactional的方法被沒有@Transactional方法調用時,會致使Transactional做用失效。也是最容易出現的狀況。this
那爲啥會出現這種狀況?其實這仍是因爲使用Spring AOP
代理形成的,由於只有當事務方法被當前類之外的代碼調用時,纔會由Spring
生成的代理對象來管理。代理
2.對非public方法進行事務註解。@Transactional 將會失效。code
緣由:是應爲在Spring AOP代理時,事務攔截器在目標方法先後進行攔截,DynamicAdvisedInterceptor
的intercept 方法會獲取Transactional註解的事務配置信息,對象
TransactionInterceptor
(事務攔截器)在目標方法執行先後進行攔截,
DynamicAdvisedInterceptor
(CglibAopProxy 的內部類)的 intercept 方法或
JdkDynamicAopProxy
的 invoke 方法會間接調用
AbstractFallbackTransactionAttributeSource
的
computeTransactionAttribute
方法會間接調用
AbstractFallbackTransactionAttributeSource
的
computeTransactionAttribute
方法,這個方法會獲取Transactional 註解的事務配置信息。他會首先校驗事務方法的修飾符是否是public,不是 public則不會獲取@Transactional 的屬性配置信息。
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 住,此時事務也會失效。