1. 程式人生 > >Spring事務處理的實現: Spring與事務

Spring事務處理的實現: Spring與事務

通過對於書上程式碼的學習和了解,本書並沒有將事務最底層的實現完全展現出來。因為這是涉及到很複雜的作業系統的一些操作,比如對於執行緒的管理,以及ThreaLocal變數的一些維護等等。這些可以說對我們這些使用者是不可見的。書上的程式碼只是將整個執行的流程給我們展現了出來,讓我們可以比較清晰地看到整個實現的過程。

在講解程式碼之前,我覺得有必要對事務的一些基本知識進行一下解釋,雖然我們對事務的概念已經很熟悉了,但是涉及到事務的傳播屬性這些概念還是很有必要知道的。

目錄

1.基礎知識

2.宣告式事務處理的基本過程


1.基礎知識

指訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。這是我在百度上找到的概念。事務的概念裡面我們可以找到一些重點。首先,“可能”。事務執行的結果有兩種,一個是提交成功,也即是操作資料庫成功。還有一個就是提交失敗,這個時候會進行相應的回滾操作,將這個事務中之前的對於資料庫的修改統統改為之前修改的結果。從這個地方我們也可以知道事務的執行和執行緒是息息相關的,因為它需要儲存執行之前的結果。和執行緒裡面的中斷有著類似的功能。

事務的傳播屬性

PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支援當前事務,如果當前沒有事務,就丟擲異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則丟擲異常。

這是我們對於我們設定為事務一系列資料庫的操作的執行要求。

2.宣告式事務處理的基本過程

  我們在使用Spring宣告式事務處理的時候,需要我們配置一個TransactionProxyFactoryBean類。這個類是整個事務處理執行的核心,它配置我們事務處理的所有基本資訊

這是原書中的解釋。從中我們可以看到事務使用了aop功能。具體的功能的使用我們在之後的分析中會慢慢看到。

首先我們來看一下關於事務處理攔截器的配置

	private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor();

這個攔截器就是通過AOP(代理機制)發揮作用,通過這個攔截器的實現,Spring封裝了事務處理實現。

 

public void setTransactionAttributes(Properties transactionAttributes) {
		this.transactionInterceptor.setTransactionAttributes(transactionAttributes);
	}

可以看到這個地方通過Properties配置物件來依賴注入事務屬性,讀取BeanDefinition中的配置資訊注入到我們之前宣告的攔截器中。接下來就是建立Spring AOP對事務處理的Advistor

我們進入到createMainInterceptor方法中

if (this.pointcut != null) {
			return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor);
		}

 如果配置了我們的切面,那麼就使用預設的通知器DefaultPointcutAdvisor

如果沒有配置切面就按照下方程式碼執行

else {
			// Rely on default pointcut.
			return new TransactionAttributeSourceAdvisor(this.transactionInterceptor);
		}

這個類的實現程式碼裡面我們可以看到Spring事務的AOP配置完成,但是書上同樣給了我們一個問題。那就是TransactionInterceptor的配置是什麼時候啟動的,從而成為了Advistor的一部分。書上給的答案是這個方法

afterPropertiesSet()

具體的實現過程和我們在AOP裡面的攔截器鏈的生成非常類似同樣是對通知器進行一個加入。這裡的通知器書上說的並不清楚,我認為是對於事務(也就是我們需要進行事務操作方法)的增強,比如執行提交成功或者回滾操作一樣。然後就是配置相應的AOP目標源。也就是我們的目標物件,包含需要被事務增強方法的物件。

當然事務和我們的AOP切面還不太一樣。因為事務的處理是很複雜的,這需要我們配置更多的其他屬性。比如我剛才所說的事務傳播屬性。這些屬性的配置,將會在TransactionInterceptor對事務方法進行攔截時起到作用。這些我打算在下一次的講解中展示出來。