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)當事務非新事務的時候也不會去執行提交事務操作。此條件主要考慮內嵌事務的情況。