Seata 源码

京东云开发者
• 阅读 12

作者:京东物流 张士欣

核心接口和类

ResourceManager

ResourceManager 是 seata 的重要组件之一,RM 负责管理分支数据资源的事务。

Seata 源码

AbstractResourceManager 实现 ResourceManager 提供模板方法。DefaultResourceManager 适配所有的 ResourceManager,所有方法调用都委派给对应负责的 ResourceManager 处理。

Seata 源码

DataSourceManager

此为 AT 模式核心管理器,DataSourceManager 继承 AbstractResourceManager,管理数据库 Resouce 的注册,提交以及回滚等。



Seata 源码



AsyncWorker

DataSourceManager 事务提交委派给 AsyncWorker 进行提交的,因为都成功了,无需回滚成功的数据,只需要删除生成的操作日志就行,采用异步方式,提高效率。

io.seata.rm.datasource.AsyncWorker#doBranchCommits
UndoLogManagerFactory.getUndoLogManager(dataSourceProxy.getDbType()).batchDeleteUndoLog(xids, branchIds, conn);

UndoLogManager

Seata 源码



TransactionManager

Seata 源码

DefaultTransactionManager

TransactionManagerHolder 为创建单例 TransactionManager 的工厂,可以使用 EnhancedServiceLoader 的 spi 机制加载自定义的类,默认为DefaultTransactionManager。

Seata 源码

GlobalTransaction

GlobalTransaction 接口提供给用户开启事务,提交,回滚,获取状态等方法。

Seata 源码

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)。

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 管理并且能够关联 GlobalTransaction。

Seata 源码

DataSourceProxy

DataSourceProxy 实现 Resource 接口,BranchType 为 AT 自动模式。它继承 AbstractDataSourceProxy 代理类,所有的 DataSource 相关的方法调用传入的targetDataSource 代理类的方法,除了创建 connection 方法为创建 ConnectionProxy 代理类。对象初始化时获取连接的 jdbcUrl 作为 resourceId,并注册至DefaultResourceManager 进行管理。同时还提供获取原始连接不被代理的 getPlainConnection 方法。

ExecuteTemplate

ExecuteTemplate 为具体 statement 的 execute,executeQuery 和 executeUpdate 执行提供模板方法。

Executor

Seata 源码

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 请求。

Seata 源码

Seata 源码



Core

Core 接口为 seata 处理全局事务协调器 TC 的核心处理器,它继承 ResourceManagerOutbound 接口,接受来自 RM 的 rpc 网络请求 (branchRegister,branchReport,lockQuery)。同时继承 TransactionManager 接口,接受来自 TM 的 rpc 网络请求(begin, commit,rollback,getStatus),另外提供提供 3 个接口方法。

Seata 源码

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,委派 Locker 进行处理。

Locker

Locker 接口提供根据行数据获取锁,释放锁,是否锁住和清除所有锁的方法。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Spring Cloud整合Seata实现分布式事务
SpringCloud整合Seata分布式事务框架Seata(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fseata%2Fseata):阿里巴巴开源的一款分布式解决方案,其前身是Fescar。官
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Stella981 Stella981
3年前
Seata
seataserver为seata中的事务协调器。参考:http://seata.io/enus/docs/ops/deployserver.html(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fseata.io%2Fenus%2Fdocs%2Fops%2Fdeploys
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
2个月前
dubbo3.0 服务导入导出原理
作者:京东物流张士欣不管是服务导出还是服务引入,都发生在应用启动过程中,比如:在启动类上加上@EnableDubbo时,该注解上有一个@DubboComponentScan注解,@DubboComponentScan注解Import了一个DubboComp
京东云开发者 京东云开发者
1个月前
MySQL存储引擎及索引简介
作者:京东物流樊芳渝一、引言在信息技术飞速发展的今天,数据库作为信息系统的核心组件,其性能和稳定性直接关系到整个系统的运行效率和用户体验。而MySQL,作为目前最流行的开源关系型数据库管理系统之一,凭借其强大的功能、灵活的扩展性和广泛的应用场景,早已成为众
美凌格栋栋酱 美凌格栋栋酱
11小时前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(