Spring源碼深度解析-第10章《事務》總結

1、事務自定義標籤

1)註冊InfrastructureAdvisorAutoProxyCreator;

2)獲取對應class/method的增強器:尋找候選增強器->候選增強器中尋找匹配項;

3)提取事務標籤。

2、聲明式的事務處理步驟

1)獲取事務的屬性;

2)加載配置中配置的TransactionManager;

3)不同的事務處理方式使用不同的邏輯;

4)在目標方法執行前獲取事務並收集事務信息;

5)執行目標方法;

6)一旦出現異常,嘗試異常處理;

7)提交事務前的事務信息清除;

8)提交事務。

3、事務的準備工作

1)獲取事務:創建對應的事務實例,這裏使用的是DataSourceTransactionManager中的doGetTransaction方法,創建基於JDBC的事務實例;

2)如果當前線程存在事務,則轉向嵌套事務的處理;

3)事務超時設置驗證;

4)事務propagationBehavior屬性的設置驗證;

5)構建DefaultTransactionStatus;

6)完善transaction,包括設置ConnectionHolder、隔離級別、timeout,如果是新連接,則綁定到當前線程。對於一些隔離級別、timeout等功能的設置並不是由Spring來完成的,而是委託給底層數據庫連接去做的,而對於數據庫連接的設置就是在doBegin函數中處理的。

a. 嘗試獲取連接;

b. 設置隔離級別以及只讀標記;

c. 更改默認的提交設置;

d. 設置標誌位,標誌當前連接已經被事務激活;

e. 設置過期時間;

f. 將connectionHolder綁定到當前線程;

g. 將事務信息記錄在當前線程中。Spring會通過TransactionInfo類型的實例中的信息來進行回滾等後續工作。

4、回滾處理

  • 回滾條件:默認情況下Spring中的事務異常處理機制只對RuntimeException和Error兩種情況感興趣。

5、事務提交

  • 某個事務是另一個事務的嵌套事務,但是,這些事務又不在Spring的管理範圍內,或者無法設置保存點,那麼Spring會通過設置回滾標誌的方式來禁止提交。
  • 符合提交的條件:

1)當事務狀態中有保存點信息的話便不會去提交事務;

2)當事務非新事務的時候也不會去執行提交事務操作。此條件主要考慮內嵌事務的情況。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章