Spring中事務的實現原理
背景:最近的專案中需要用到Spring的事務管理相關的知識,以前也瞭解過Spring的事務管理,但是僅僅止步於會用,這一次藉著這次機會,深入原始碼分析一下Spring是如何實現事務的。
前面已經有一篇文章講過了如何在Spring中使用宣告式事務,並對一些特性進行了講解,具體如下:Spring事務管理-使用基礎
這一篇文章從SpringBoot啟動出發,到Spring實現事務管理,從原始碼角度,分析其實現原理, 主要分為以下幾個部分:
(1)SpringBoot怎麼啟動Spring的事務管理的
(2)Spring的事務管理實現原理
(3)基於JDK的動態代理的AOP是如何與Spring事務結合的(Spring事務管理是基於AOP實現的)。
1. SpringBoot啟動事務原理分析
要理解Spring的事務管理,首先要從SpringBoot啟動Spring事務的流程開始,初步理解下Spring事務執行機制。
基於SpringBoot的autoconfiguration機制,可以得到如下啟動流程圖:
當我們的啟動類Application上,加上了 @EnableTransctionManagement
註解就表示使用Spring事務機制來進行事務管理。從上圖中我們可以知道SpringBoot啟動時,關於事務管理主要分為以下幾步:
1)ProxyTransctionManagementConfiguration
(1)自動裝配配置類 ProxyTransctionManagementConfiguration,這個類首先注入了AnnotationTransactionAttributeSource,用來讀取解析 @Transactional註解,獲取需要進行事務管理的方法,並將相關的事務管理配置的引數暴露給Spring。
(2)注入TransactionInterceptor:基於AOP MethodInterceptor實現的宣告式事務管理,內部依賴於TransactionManager,TransactionManager是實際的事務管理物件。
(3)注入BeanFactoryTransactionAttributeSourceAdvisor:由AnnotationTransactionAttributeSource驅動的AOP Advisor,用於為@Transactional註解的方法新增一個事務advice通知
2)注入DataSource
這裡主要是看你的專案使用的是什麼資料來源,dbcp、阿里的druid、TDDL等等,然後注入DataSource介面的實現類就OK了。
因為Spring的事務管理是基於資料來源的事務實現的,也就是說Spring的TransactionManager是依賴於DataSource的,所以必須先注入這個資料來源這個bean.
3)DataSourceTransactionManagerAutoConfiguration
Spring中預設的事務管理器是:DataSourceTransactionManager,事務管理是依賴於DataSource,
4)TransactionAutoConfiguration
這個主要是注入了TransactionTemplate這個bean,這個類主要是用於程式設計式事務的,當我們需要使用程式設計式事務的時候,直接注入這個bean, 然後呼叫相應的介面,實現事務的管理。當我們通過Spring的宣告式事務管理的時候,是用不到這個類的。
以上就是SpringBoot啟動Spring事務管理的過程,以及相互依賴關係
2. Spring的事務管理實現原理
從前面我們已經瞭解到,Spring的事務管理是基於TransactionManager,