源碼解讀 - Tcc-Transaction框架(二)職責劃分及功能調整

前言

回到master-1.2.x分支,繼續瀏覽git log,在1.0.3版本後,作者更新較爲頻繁,每個月都有提交,在2016/6/4日有一次版本變更1.1.0,但是不要急,根據這段時間文件變更內容看,東西修改了不少,但是1.1.0之後還有幾次頻繁修改,包括幾個issue的修訂。

最後我確定從issue#22的修復爲模板,拉取分支(afterv1.1.0-resolvesTheIssue22),go on。

正文

主要功能模塊

tcc-transaction-api

增加了UuidUtils:工具類,uuid與byte[]互轉

tcc-transaction-core

core模塊結構

  1. common包,包含MethodType和TransactionType,之前就有,換了下位置。
  2. interceptor包,包含CompensableTransactionInterceptor和ResourceCoordinatorInterceptor,簡單看內容,是將之前sping下的兩個aop拆解出來,放到core模塊。
  3. recover包,事務補償相關,不在本次分析內。
  4. repository包,持久化相關,增加了很多,如FileSystem、Jdbc、Redis、Zookeeper,而CachableTransactionRepository是作爲基類存在。
  5. serializer包,序列化相關,包含JDK和Kryo兩種方式。
  6. support包,BeanFactory及其適配器類BeanFactoryAdapter、事務配置接口TransactionConfigurator。
  7. utils包,工具包,其中CompensableMethodUtils內容爲重點。

其他類:

  • 細分了異常(CancellingException、ConfirmingException、NoExistedTransactionException、OptimisticLockException、SystemException),
  • 核心註解Compensable,
  • 將註解屬性由字符串轉換爲可執行方法的一系列類:存儲註解配置信息的InvocationContext,橋接類Participant,最終執行者Terminator
  • 記錄事務信息的Transaction、對事務信息進行CRUD操作的TransactionManager(這裏的ConcurrentHashMap變更爲ThreadLocal<Transaction>)
  • 定義事務信息持久化操作的接口TransactionRepository

以上共同構成了框架的核心代碼tcc-transaction-core模塊。

tcc-transaction-spring

依然包含數據庫腳本db.sql,其中幾個字段類型由varchar變爲varbinary,應該是通過api.UuidUtils實現的轉換。

  1. recover包,數據補償操作,暫不關心。

  2. repository包:只有SpringJdbcTransactionRepository,spring下的倉儲方式,需要配置DataSource,在新增的測試模塊tutorial-sample和單元測試模塊unit-test有使用。

  3. support包:與core模塊中的support包呼應。

support內:

  • TccApplicationContext實現BeanFactory、ApplicationContextAware,成員有ApplicationContext(set注入),getBean,用ApplicationContext獲取bean。
  • TccBeanPostProcessor實現ApplicationListener,重寫onApplicationEvent在應用啓動後獲取ApplicationContext,再獲取BeanFactory注入到BeanFactoryAdapter中。
  • TccTransactionConfigurator實現TransactionConfigurator接口,實現了獲取transactionManager、transactionRepository、recoverConfig三個方法。通過spring-xml注入。

其他類:

  • TccCompensableAspect,通過spring-xml注入,其成員CompensableTransactionInterceptor通過set注入
  • TccTransactionContextAspect,通過spring-xml注入,其成員ResourceCoordinatorInterceptor通過set注入

整體看來變化不大,關鍵點是兩個aop類的結構變化,將核心代碼轉移到了core模塊下。

tcc-transaction-tutorial-sample

這個模塊下都是demo,目前有dubbo方式服務的集成例子,有時間再分析。

tcc-transaction-unit-test

結構基本沒有變化,執行下org.mengyun.tcctransaction.unit.test.TransferServiceTest#testTransfer,看一下調用過程,觀察每個節點數據變化。

結尾

這個版本看下來,更多是在進行整理,將模塊職責劃分清楚些。

另外,有一點是之前沒思路上注意到的,就是org.mengyun.tcctransaction.unittest.client.AccountServiceProxy#transferTo(...)這個方法的實現,是通過多線程方式進行下級服務調用的,也就是通過多線程方式開啓分支事務,應該是對應於TransactionManager中分支事務相關信息的緩存操作是記錄在ThreadLocal<Transaction> threadLocalTransaction,也就是ROOT事務和分支事務是有獨立的Transaction對象進行記錄的,而且在ResourceCoordinatorInterceptor中需要將Participant“註冊”到Transaction中,使用多線程就更加容易理解,由ThreadLocal獨立存儲Transaction,在不同線程中觸發aop,不同方法封裝不同的Participant,記錄到Transaction中達到事務信息隔離。

還有一點,在進行單元測試時,最好將補償流程的job註釋掉,不然會干擾測試結果(主要是斷點時間過長,數據就會出問題,什麼問題可以自行驗證)。

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