Seata 源码
作者:京东物流 张士欣
核心接口和类
ResourceManager
ResourceManager 是 seata 的重要组件之一,RM 负责管理分支数据资源的事务。
AbstractResourceManager 实现 ResourceManager 提供模板方法。DefaultResourceManager 适配所有的 ResourceManager,所有方法调用都委派给对应负责的 ResourceManager 处理。
DataSourceManager
此为 AT 模式核心管理器,DataSourceManager 继承 AbstractResourceManager,管理数据库 Resouce 的注册,提交以及回滚等。
AsyncWorker
DataSourceManager 事务提交委派给 AsyncWorker 进行提交的,因为都成功了,无需回滚成功的数据,只需要删除生成的操作日志就行,采用异步方式,提高效率。
UndoLogManager
TransactionManager
DefaultTransactionManager
TransactionManagerHolder 为创建单例 TransactionManager 的工厂,可以使用 EnhancedServiceLoader 的 spi 机制加载自定义的类,默认为 DefaultTransactionManager。
GlobalTransaction
GlobalTransaction 接口提供给用户开启事务,提交,回滚,获取状态等方法。
DefaultGlobalTransaction
DefaultGlobalTransaction 是 GlobalTransaction 接口的默认实现,它持有 TransactionManager 对象,默认开启事务超时时间为 60 秒,默认名称为 default,因为调用者的业务方法可能多重嵌套创建多个 GlobalTransaction 对象开启事务方法,因此 GlobalTransaction 有 GlobalTransactionRole 角色属性,只有 Launcher 角色的才有开启、提交、回滚事务的权利。
GlobalTransactionContext
GlobalTransactionContext 为操作 GlobalTransaction 的工具类,提供创建新的 GlobalTransaction,获取当前线程有的 GlobalTransaction 等方法。
GlobalTransactionScanner
GlobalTransactionScanner 继承 AbstractAutoProxyCreator 类,即实现了 SmartInstantiationAwareBeanPostProcessor 接口,会在 spring 容器启动初始化 bean 的时候,对 bean 进行代理操作。wrapIfNecessary 为继承父类代理 bean 的核心方法,如果配置了 service.disableGlobalTransaction 为 false 属性则注解不生效直接返回,否则对 GlobalTransactional 或 GlobalLock 的方法进行拦截代理。
GlobalTransactionalInterceptor
GlobalTransactionalInterceptor 实现 aop 的 MethodInterceptor 接口,对有 @GlobalTransactional 或 GlobalLock 注解的方法进行代理。
TransactionalTemplate
TransactionalTemplate 模板类提供了一个开启事务,执行业务,成功提交和失败回滚的模板方法 execute(TransactionalExecutor business)。
Resource
Resource 能被 ResourceManager 管理并且能够关联 GlobalTransaction。
DataSourceProxy
DataSourceProxy 实现 Resource 接口,BranchType 为 AT 自动模式。它继承 AbstractDataSourceProxy 代理类,所有的 DataSource 相关的方法调用传入的 targetDataSource 代理类的方法,除了创建 connection 方法为创建 ConnectionProxy 代理类。对象初始化时获取连接的 jdbcUrl 作为 resourceId,并注册至 DefaultResourceManager 进行管理。同时还提供获取原始连接不被代理的 getPlainConnection 方法。
ExecuteTemplate
ExecuteTemplate 为具体 statement 的 execute,executeQuery 和 executeUpdate 执行提供模板方法。
Executor
SQLRecognizer
SQLRecognizer 识别 sql 类型,获取表名,表别名以及原生 sql
UndoExecutorFactory
UndoExecutorFactory 根据 sqlType 生成对应的 AbstractUndoExecutor。
UndoExecutor 为生成执行 undoSql 的核心。如果全局事务回滚,它会根据 beforeImage 和 afterImage 以及 sql 类型生成对应的反向 sql 执行回滚数据,并添加脏数据校验机制,使回滚数据更加可靠。
DefaultCoordinator
DefaultCoordinator 即为 TC,全局事务默认的事务协调器。它继承 AbstractTCInboundHandler 接口,为 TC 接收 RM 和 TM 的 request 请求数据,是进行相应处理的处理器。实现 TransactionMessageHandler 接口,去处理收到的 RPC 信息。实现 ResourceManagerInbound 接口,发送至 RM 的 branchCommit,branchRollback 请求。
Core
Core 接口为 seata 处理全局事务协调器 TC 的核心处理器,它继承 ResourceManagerOutbound 接口,接受来自 RM 的 rpc 网络请求 (branchRegister,branchReport,lockQuery)。同时继承 TransactionManager 接口,接受来自 TM 的 rpc 网络请求(begin, commit,rollback,getStatus),另外提供提供 3 个接口方法。
GlobalSession
GlobalSession 是 seata 协调器 DefaultCoordinator 管理维护的重要部件,当用户开启全局分布式事务,TM 调用 begin 方法请求至 TC,TC 则创建 GlobalSession 实例对象,返回唯一的 xid。它实现 SessionLifecycle 接口,提供 begin,changeStatus,changeBranchStatus,addBranch,removeBranch 等操作 session 和 branchSession 的方法。
BranchSession
BranchSession 为分支 session,管理分支数据,受 globalSession 统一调度管理,它的 lock 和 unlock 方法由 lockManger 实现。
LockManager
DefaultLockManager 是 LockManager 的默认实现,它获取 branchSession 的 lockKey,转换成 List<RowLock>,委派 Locker 进行处理。
Locker
Locker 接口提供根据行数据获取锁,释放锁,是否锁住和清除所有锁的方法。
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/7c1d9d425bba66622c6888b4e】。文章转载请联系作者。
评论