1、注解TxcTransaction
2、在其注解接口附近查找aop配置:TransactionAspect
3、runTransaction是在執行事務業務代碼時的包裝邏輯
4、transactionServiceExecutor.transactionRunning(info);
5、獲取本地分布式事務控制器 loadDTXLocalControl找到TxcRunningTransaction
6、根據注解和切面配置,resolvePropagationState返回是DTXPropagationState.JOIN
7、DTXServiceExecutor dtxLocalControl.doBusinessCode(info),直接線索中斷
8、回到剛才切面所在的包,發現還有DataSourceAspect,對數據庫連接進行了替換,非常重要,先看看連接的接口有什么東西,想想我們的jdbc寫法也是弄一個連接,然后調用其中的各種方法
9、
DTXResourceWeaver 對獲取db連接進行了封裝,其中有執行sql的相關動作改寫
txLcnBeanHelper.loadTransactionResourceProxy(transactionType);
找到transaction_txc TxcTransactionResourceProxy執行的proxyConnection,繼續進入方法
10、查看ConnectionWrapper其中的commit rollback等對原始的數據庫連接進行了替換,有用到jdbcEventListener,分析listener
11、找到ConnectionHelper其中注入的CompoundJdbcEventListener,這個bean在類名上已經進行了標記,里面用的P6spyJdbcEventListener實際上是TxcJdbcEventListener
12、隨便看個update 63行看看攔截的處理sqlExecuteInterceptor.preUpdate((Update) statement);粗看其中的代碼,有一段前置准備,最后96行txcService.resolveUpdateImage(updateImageParams);
13、粗看resolveUpdateImage其中代碼,就是對影響范圍進行分析,然后保留undo數據(195行方法內部162行)
14、到此基本我們可以驗證之前的txc的理論,剛才部分分析比較粗略,大家有時間可以自己細看