前言:
本文章會通過連載的方式來深入了解和學習Spring相關核心技術和實現原理。包括Spring的Bean生命周期管理,聲明性事務管理,AOP管理,注解應用實現,以及在其上面進行擴展的相關應用。
本篇技術文章將介紹Spring聲明式事務管理實現技術細節的剖析。
首先看一下Spring基于XML方式的聲明式事務配置方法。(基于注解的也是相同,下篇在介紹Spring注解應用擴展實現時,會再介紹基于注解的Spring聲明式事務的實現細節)
首先配置 BeanNameAutoProxyCreator 實現基于Bean 名稱規則匹配的AOP攔截
示例代碼如下:
從上面的配置示例中,可以發現Spring的聲明式事務由一個叫TransactionInterceptor 的AOP攔截器實現, 我們代碼的整體分析過程也是從這個類開始
TransacionInterceptor的類描述如下,其實現了MethodInterceptor接口
代碼主體邏輯都是invoke方法里
下面是invoke方法的主要邏輯說明
首先獲得攔載的方法名和類名,根據在xml文件的匹配規則,找出事務的配置規則,創建TransactionAttribute對象(如事務的讀寫屬性,傳播屬性,事務隔離級別等)
如果匹配事務規則,則調用 createTransactionIfNecessary方法創建事務
整理創建事務的過程,則會調用Spring的PlatformTransactionManager的接口實現類,示例中配置的是HibernateTransactionManager
整理個事務創建過程中,會用到兩個重要的對象,說明如下:
HibernateTransactionObject 保存事務狀態(是否新事務,是否新的SessionHolder,以前對應的SessionHolder實例) SessionHolder則是用于保持Transaction對象實例,以及管理事務所需要相關信息如引用次數,是否只能回滾等。
TransactionSynchronizationManager 管理當前線程的事務運行情況,所有的事務傳播嵌套處理都由它來控制管理,它會保存以下信息:
當前的事務名稱 currentTransactionName
當前只讀事務的狀態 currentTransactionReadOnly
當前事務使用的隔離級別 currentTransactionIsolationLevel
當前同步控制TransactionSynchronization對象synchronizations
當前的ResourceHolder對象實列,保存連接對象resources
下面是創建事務的序列圖
核心代碼及說明如下:
在創建事務過程中,會檢測之前有沒有事務開啟,如果有則會根據當前方法上設置的事務的傳播信息來決定是否使用原來事務,還是掛起原來事務,或開啟新的事務等。
AbstractPlatformTransactionManager.getTransaction方法
是否新開啟事務最終會將該狀態設置到HibernateTransactionObject的newSession屬性上。這樣在嵌套的方法退出時,可以由這個屬性來決定要不要真正的提交事務。
封裝創建JDBC的事務代碼如下:HibernateTransactionManager.doBegin()方法
事務的提交和回滾實現
事務提交 由TransactionInterceptor的commitTransactionAfterReturning來實現
主要代碼如下:AbstractPlatformTransactionManager#commit方法
事務回滾由TransactionInterceptor的completeTransactionAfterThrowing來實現
主要代碼如下:AbstractPlatformTransactionManager#rollback方法
基本上Spring的聲明式事務的基本實現原理都已經介紹完了,下面附上相關的源碼文件列表:
TransactionInterceptor.java
HiberanteTransactionManager.java
AbstractPlatformTransactionManager.java
TransactionSynchronizationManager.java
SessionHolder.java
ConnectionHolder.java
TransactionStatus.java
Good Luck!
Yours Mattthew!