作者:京東物流 張士欣
核心接口和類
ResourceManager
ResourceManager 是 seata 的重要組件之一,RM 負(fù)責(zé)管理分支數(shù)據(jù)資源的事務(wù)。
AbstractResourceManager 實(shí)現(xiàn) ResourceManager 提供模板方法。DefaultResourceManager 適配所有的 ResourceManager,所有方法調(diào)用都委派給對(duì)應(yīng)負(fù)責(zé)的 ResourceManager 處理。
DataSourceManager
此為 AT 模式核心管理器,DataSourceManager 繼承 AbstractResourceManager,管理數(shù)據(jù)庫(kù) Resouce 的注冊(cè),提交以及回滾等。
AsyncWorker
DataSourceManager 事務(wù)提交委派給 AsyncWorker 進(jìn)行提交的,因?yàn)槎汲晒α耍瑹o(wú)需回滾成功的數(shù)據(jù),只需要?jiǎng)h除生成的操作日志就行,采用異步方式,提高效率。
io.seata.rm.datasource.AsyncWorker#doBranchCommits UndoLogManagerFactory.getUndoLogManager(dataSourceProxy.getDbType()).batchDeleteUndoLog(xids, branchIds, conn);
UndoLogManager
TransactionManager
DefaultTransactionManager
TransactionManagerHolder 為創(chuàng)建單例 TransactionManager 的工廠,可以使用 EnhancedServiceLoader 的 spi 機(jī)制加載自定義的類,默認(rèn)為DefaultTransactionManager。
GlobalTransaction
GlobalTransaction 接口提供給用戶開(kāi)啟事務(wù),提交,回滾,獲取狀態(tài)等方法。
DefaultGlobalTransaction
DefaultGlobalTransaction 是 GlobalTransaction 接口的默認(rèn)實(shí)現(xiàn),它持有 TransactionManager 對(duì)象,默認(rèn)開(kāi)啟事務(wù)超時(shí)時(shí)間為 60 秒,默認(rèn)名稱為 default,因?yàn)檎{(diào)用者的業(yè)務(wù)方法可能多重嵌套創(chuàng)建多個(gè) GlobalTransaction 對(duì)象開(kāi)啟事務(wù)方法,因此 GlobalTransaction 有 GlobalTransactionRole 角色屬性,只有Launcher 角色的才有開(kāi)啟、提交、回滾事務(wù)的權(quán)利。
GlobalTransactionContext
GlobalTransactionContext 為操作 GlobalTransaction 的工具類,提供創(chuàng)建新的 GlobalTransaction,獲取當(dāng)前線程有的 GlobalTransaction 等方法。
GlobalTransactionScanner
GlobalTransactionScanner 繼承 AbstractAutoProxyCreator 類,即實(shí)現(xiàn)了 SmartInstantiationAwareBeanPostProcessor 接口,會(huì)在 spring 容器啟動(dòng)初始化bean 的時(shí)候,對(duì) bean 進(jìn)行代理操作。wrapIfNecessary 為繼承父類代理 bean 的核心方法,如果配置了 service.disableGlobalTransaction 為 false 屬性則注解不生效直接返回,否則對(duì) GlobalTransactional 或 GlobalLock 的方法進(jìn)行攔截代理。
GlobalTransactionalInterceptor
GlobalTransactionalInterceptor 實(shí)現(xiàn) aop 的 MethodInterceptor 接口,對(duì)有 @GlobalTransactional 或 GlobalLock 注解的方法進(jìn)行代理。
TransactionalTemplate
TransactionalTemplate 模板類提供了一個(gè)開(kāi)啟事務(wù),執(zhí)行業(yè)務(wù),成功提交和失敗回滾的模板方法 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 管理并且能夠關(guān)聯(lián) GlobalTransaction。
DataSourceProxy
DataSourceProxy 實(shí)現(xiàn) Resource 接口,BranchType 為 AT 自動(dòng)模式。它繼承 AbstractDataSourceProxy 代理類,所有的 DataSource 相關(guān)的方法調(diào)用傳入的targetDataSource 代理類的方法,除了創(chuàng)建 connection 方法為創(chuàng)建 ConnectionProxy 代理類。對(duì)象初始化時(shí)獲取連接的 jdbcUrl 作為 resourceId,并注冊(cè)至DefaultResourceManager 進(jìn)行管理。同時(shí)還提供獲取原始連接不被代理的 getPlainConnection 方法。
ExecuteTemplate
ExecuteTemplate 為具體 statement 的 execute,executeQuery 和 executeUpdate 執(zhí)行提供模板方法。
Executor
SQLRecognizer
SQLRecognizer 識(shí)別 sql 類型,獲取表名,表別名以及原生 sql
UndoExecutorFactory
UndoExecutorFactory 根據(jù) sqlType 生成對(duì)應(yīng)的 AbstractUndoExecutor。
UndoExecutor 為生成執(zhí)行 undoSql 的核心。如果全局事務(wù)回滾,它會(huì)根據(jù) beforeImage 和 afterImage 以及 sql 類型生成對(duì)應(yīng)的反向 sql 執(zhí)行回滾數(shù)據(jù),并添加臟數(shù)據(jù)校驗(yàn)機(jī)制,使回滾數(shù)據(jù)更加可靠。
DefaultCoordinator
DefaultCoordinator 即為 TC,全局事務(wù)默認(rèn)的事務(wù)協(xié)調(diào)器。它繼承 AbstractTCInboundHandler 接口,為 TC 接收 RM 和 TM 的 request 請(qǐng)求數(shù)據(jù),是進(jìn)行相應(yīng)處理的處理器。實(shí)現(xiàn) TransactionMessageHandler 接口,去處理收到的 RPC 信息。實(shí)現(xiàn) ResourceManagerInbound 接口,發(fā)送至 RM 的 branchCommit,branchRollback 請(qǐng)求。
Core
Core 接口為 seata 處理全局事務(wù)協(xié)調(diào)器 TC 的核心處理器,它繼承 ResourceManagerOutbound 接口,接受來(lái)自 RM 的 rpc 網(wǎng)絡(luò)請(qǐng)求 (branchRegister,branchReport,lockQuery)。同時(shí)繼承 TransactionManager 接口,接受來(lái)自 TM 的 rpc 網(wǎng)絡(luò)請(qǐng)求(begin, commit,rollback,getStatus),另外提供提供 3 個(gè)接口方法。
GlobalSession
GlobalSession 是 seata 協(xié)調(diào)器 DefaultCoordinator 管理維護(hù)的重要部件,當(dāng)用戶開(kāi)啟全局分布式事務(wù),TM 調(diào)用 begin 方法請(qǐng)求至 TC,TC 則創(chuàng)建GlobalSession 實(shí)例對(duì)象,返回唯一的 xid。它實(shí)現(xiàn) SessionLifecycle 接口,提供 begin,changeStatus,changeBranchStatus,addBranch,removeBranch 等操作 session 和 branchSession 的方法。
BranchSession
BranchSession 為分支 session,管理分支數(shù)據(jù),受 globalSession 統(tǒng)一調(diào)度管理,它的 lock 和 unlock 方法由 lockManger 實(shí)現(xiàn)。
LockManager
DefaultLockManager 是 LockManager 的默認(rèn)實(shí)現(xiàn),它獲取 branchSession 的 lockKey,轉(zhuǎn)換成 List,委派 Locker 進(jìn)行處理。
Locker
Locker 接口提供根據(jù)行數(shù)據(jù)獲取鎖,釋放鎖,是否鎖住和清除所有鎖的方法。
審核編輯 黃宇
-
源碼
+關(guān)注
關(guān)注
8文章
654瀏覽量
29608
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
淺談計(jì)算機(jī)的硬件維護(hù)
淺談HAL庫(kù)uart數(shù)據(jù)收發(fā)與部分源碼
淺談ADC按鍵的應(yīng)用設(shè)計(jì)

從代碼角度詳解Seata AT事務(wù)模式的流程
AOSP Android11系統(tǒng)源碼和內(nèi)核源碼簡(jiǎn)析
保姆級(jí)教程:Spring Cloud 集成Seata分布式事務(wù)

評(píng)論