《Spring技術內幕:深入解析Spring架構與設計原理》筆記之六(Spring事務處理的實現)
1.Spring與事務處理
有了Spring事務管理的支援,只需要通過一些簡單的配置,應用就能完成複雜的事務處理工作,從而為使用者使用事務處理提供很大的方便。
2.Spring事務處理的設計概覽
Spring事務處理模組中的類層次結構
在Spring事務處理中,可以通過設計一個TransactionProxyFactoryBean來使用AOP功能,通過這個TransactionProxyFactoryBean可以生成Proxy代理物件,在這個代理物件中,通過TransactionInterceptor來完成對代理方法的攔截,正是這些AOP攔截功能,將事務處理的功能編織進來。在Spring事務處理中,在實現宣告式事務處理時,這是AOP和IOC模組整合的部分。在Spring事務處理中,對主要的事務實現做了一個抽象和適配。適配的具體事務處理器包括:對DataSource資料來源的事務處理支援,對Hibernate資料來源的事務處理支援,對JDO資料來源的事務處理支援,對JPA和JTA等資料來源的事務處理支援。這一系列事務處理支援,都是通過設計PlatformTransactionManager、AbstractPlatforTransactionManager以及一系列具體事務處理器來實現,而PlatformTransactionManager又實現了TransactionInterceptor介面,通過這樣一個介面實現設計,就把這一系列的事務處理的實現與前面提到的TransactionProxyFactoryBean結合起來,從而形成了一個Spring宣告式事務處理的設計體系。
3.Spring事務處理的應用場景
Spring為常用的資料來源的事務處理支援提供一系列的TransactionManager。
4.Spring宣告式事務處理
4.1設計原理和基本過程
宣告式事務處理的步驟:
- 讀取和處理在IOC容器中配置的事務處理屬性,並轉換為Spring事務處理需要的內部資料結構。
- Spring事務處理模組實現統一的事務處理過程。這個通用的事務處理過程包含處理事務配置屬性,以及與執行緒繫結完成事務處理的過程,Spring通過TransactionInfo和TransactionStatus這兩個資料物件,在事務處理過程中記錄和傳遞相關執行場景。
- 底層的事務處理實現。對於底層的事務操作,Spring委託給具體的事務處理器來完成,這些具體的事務處理器,就是在IOC容器中配置宣告式事務處理時,配置的platformTransactionManager的具體實現,比如DataSourceTransactionManager和HibernateTransactionManager等。
4.2實現分析
1.事務處理攔截器的配置
建立事務處理物件的時序圖
在建立TransactionProxyFactoryBeans的事務處理攔截器的時候,首先需要對ProxyFactory物件,從而實現AOP的使用。
2.事務處理配置的讀入
這個為事務處理服務的TransactionAttributeSourcePointcut的matches方法實現中,首先把事務方法的屬性配置讀取到TransactionAttributeSource物件中,有了這些事務處理的配置以後,根據當前方法呼叫的Method物件和目標物件,對是否需要啟動事務處理攔截器進行判斷。
3.事務處理攔截器的設計與實現
事務提交的時序圖
在這個invoke()方法的實現中,可以看到整個事務處理在AOP攔截器中實現的全過程。同時,它也是spring採用AOP封裝事務處理和實現宣告式處理的核心部分。
5.Spring事務處理的設計和實現
5.1Spring事務處理的程式設計式使用
這個程式設計式使用事務管理的過程中,沒有看到框架特性的使用,非常簡單和直接,很好地說明了事務管理的基本實現過程,以及在Spring事務處理實現中涉及一些主要的類,比如TransactionStatus、TransactionManager等,對這些類的使用與宣告式事務處理的最終實現是一樣的。
5.2事務的建立
作為宣告式事務處理實現的起始點,需要注意TransactionInterceptor攔截器的invoke回撥中使用的createTransactionIfNecessary方法,這個方法是在TransactionInterceptor的基類TransactionAspectSupport中實現的。
呼叫createTransactionIfNecessary的時序圖
5.3事務的掛起
5.4事務的提交
5.5事務的回滾
6.Spring的事務處理器的設計與實現
6.1Spring事務處理的應用場景
Spring事務管理器的類設計
6.2DataSourceTransactionManager的實現
如果使用DataSource建立事務,最終通過設定Connection的AutoCommit屬性來對事務處理進行配置。
實現DataSourceTransactionManager的時序圖
使用DataSourceTransactionManager實現事務建立、提交和回滾的過程,基本上與單獨使用Connection實現事務處理是一樣的,也是通過設定autoCommit屬性,呼叫Connection的commit和rollback方法來完成的。
6.3HibernateTransactionManager的實現
HibernateTransactionManager實現事務處理的時序圖