作者:京東物流 張士欣
核心接口和類
ResourceManager
ResourceManager 是 seata 的重要組件之一,RM 負責管理分支數(shù)據(jù)資源的事務。
AbstractResourceManager 實現(xiàn) ResourceManager 提供模板方法。DefaultResourceManager 適配所有的 ResourceManager,所有方法調(diào)用都委派給對應負責的 ResourceManager 處理。
DataSourceManager
此為 AT 模式核心管理器,DataSourceManager 繼承 AbstractResourceManager,管理數(shù)據(jù)庫 Resouce 的注冊,提交以及回滾等。
AsyncWorker
DataSourceManager 事務提交委派給 AsyncWorker 進行提交的,因為都成功了,無需回滾成功的數(shù)據(jù),只需要刪除生成的操作日志就行,采用異步方式,提高效率。
io.seata.rm.datasource.AsyncWorker#doBranchCommits UndoLogManagerFactory.getUndoLogManager(dataSourceProxy.getDbType()).batchDeleteUndoLog(xids, branchIds, conn);
UndoLogManager
TransactionManager
DefaultTransactionManager
TransactionManagerHolder 為創(chuàng)建單例 TransactionManager 的工廠,可以使用 EnhancedServiceLoader 的 spi 機制加載自定義的類,默認為DefaultTransactionManager。
GlobalTransaction
GlobalTransaction 接口提供給用戶開啟事務,提交,回滾,獲取狀態(tài)等方法。
DefaultGlobalTransaction
DefaultGlobalTransaction 是 GlobalTransaction 接口的默認實現(xiàn),它持有 TransactionManager 對象,默認開啟事務超時時間為 60 秒,默認名稱為 default,因為調(diào)用者的業(yè)務方法可能多重嵌套創(chuàng)建多個 GlobalTransaction 對象開啟事務方法,因此 GlobalTransaction 有 GlobalTransactionRole 角色屬性,只有Launcher 角色的才有開啟、提交、回滾事務的權利。
GlobalTransactionContext
GlobalTransactionContext 為操作 GlobalTransaction 的工具類,提供創(chuàng)建新的 GlobalTransaction,獲取當前線程有的 GlobalTransaction 等方法。
GlobalTransactionScanner
GlobalTransactionScanner 繼承 AbstractAutoProxyCreator 類,即實現(xiàn)了 SmartInstantiationAwareBeanPostProcessor 接口,會在 spring 容器啟動初始化bean 的時候,對 bean 進行代理操作。wrapIfNecessary 為繼承父類代理 bean 的核心方法,如果配置了 service.disableGlobalTransaction 為 false 屬性則注解不生效直接返回,否則對 GlobalTransactional 或 GlobalLock 的方法進行攔截代理。
GlobalTransactionalInterceptor
GlobalTransactionalInterceptor 實現(xiàn) aop 的 MethodInterceptor 接口,對有 @GlobalTransactional 或 GlobalLock 注解的方法進行代理。
TransactionalTemplate
TransactionalTemplate 模板類提供了一個開啟事務,執(zhí)行業(yè)務,成功提交和失敗回滾的模板方法 execute(TransactionalExecutor business)。
try {
// 2. If the tx role is 'GlobalTransactionRole.Launcher', send the request of beginTransaction to TC,
// else do nothing. Of course, the hooks will still be triggered.
beginTransaction(txInfo, tx);
Object rs;
try {
// Do Your Business
rs = business.execute();
} catch (Throwable ex) {
// 3. The needed business exception to rollback.
completeTransactionAfterThrowing(txInfo, tx, ex);
throw ex;
}
// 4. everything is fine, commit.
commitTransaction(tx);
return rs;
} finally {
//5. clear
resumeGlobalLockConfig(previousConfig);
triggerAfterCompletion();
cleanUp();
}
Resource
Resource 能被 ResourceManager 管理并且能夠關聯(lián) GlobalTransaction。
DataSourceProxy
DataSourceProxy 實現(xiàn) Resource 接口,BranchType 為 AT 自動模式。它繼承 AbstractDataSourceProxy 代理類,所有的 DataSource 相關的方法調(diào)用傳入的targetDataSource 代理類的方法,除了創(chuàng)建 connection 方法為創(chuàng)建 ConnectionProxy 代理類。對象初始化時獲取連接的 jdbcUrl 作為 resourceId,并注冊至DefaultResourceManager 進行管理。同時還提供獲取原始連接不被代理的 getPlainConnection 方法。
ExecuteTemplate
ExecuteTemplate 為具體 statement 的 execute,executeQuery 和 executeUpdate 執(zhí)行提供模板方法。
Executor
SQLRecognizer
SQLRecognizer 識別 sql 類型,獲取表名,表別名以及原生 sql
UndoExecutorFactory
UndoExecutorFactory 根據(jù) sqlType 生成對應的 AbstractUndoExecutor。
UndoExecutor 為生成執(zhí)行 undoSql 的核心。如果全局事務回滾,它會根據(jù) beforeImage 和 afterImage 以及 sql 類型生成對應的反向 sql 執(zhí)行回滾數(shù)據(jù),并添加臟數(shù)據(jù)校驗機制,使回滾數(shù)據(jù)更加可靠。
DefaultCoordinator
DefaultCoordinator 即為 TC,全局事務默認的事務協(xié)調(diào)器。它繼承 AbstractTCInboundHandler 接口,為 TC 接收 RM 和 TM 的 request 請求數(shù)據(jù),是進行相應處理的處理器。實現(xiàn) TransactionMessageHandler 接口,去處理收到的 RPC 信息。實現(xiàn) ResourceManagerInbound 接口,發(fā)送至 RM 的 branchCommit,branchRollback 請求。
Core
Core 接口為 seata 處理全局事務協(xié)調(diào)器 TC 的核心處理器,它繼承 ResourceManagerOutbound 接口,接受來自 RM 的 rpc 網(wǎng)絡請求 (branchRegister,branchReport,lockQuery)。同時繼承 TransactionManager 接口,接受來自 TM 的 rpc 網(wǎng)絡請求(begin, commit,rollback,getStatus),另外提供提供 3 個接口方法。
GlobalSession
GlobalSession 是 seata 協(xié)調(diào)器 DefaultCoordinator 管理維護的重要部件,當用戶開啟全局分布式事務,TM 調(diào)用 begin 方法請求至 TC,TC 則創(chuàng)建GlobalSession 實例對象,返回唯一的 xid。它實現(xiàn) SessionLifecycle 接口,提供 begin,changeStatus,changeBranchStatus,addBranch,removeBranch 等操作 session 和 branchSession 的方法。
BranchSession
BranchSession 為分支 session,管理分支數(shù)據(jù),受 globalSession 統(tǒng)一調(diào)度管理,它的 lock 和 unlock 方法由 lockManger 實現(xiàn)。
LockManager
DefaultLockManager 是 LockManager 的默認實現(xiàn),它獲取 branchSession 的 lockKey,轉(zhuǎn)換成 List,委派 Locker 進行處理。
Locker
Locker 接口提供根據(jù)行數(shù)據(jù)獲取鎖,釋放鎖,是否鎖住和清除所有鎖的方法。
審核編輯 黃宇
-
源碼
+關注
關注
8文章
678瀏覽量
30911
發(fā)布評論請先 登錄
淺談計算機的硬件維護
淺談HAL庫uart數(shù)據(jù)收發(fā)與部分源碼
從代碼角度詳解Seata AT事務模式的流程
AOSP Android11系統(tǒng)源碼和內(nèi)核源碼簡析
保姆級教程:Spring Cloud 集成Seata分布式事務

淺談Seata 源碼
評論