-
eata-Server设计
seata-server是一个单独进程服务,与TM/RM的交互是RPC
image
1)Coordinator Core:最下面的模块是事务协调器核心代码,主要用来处理事务协调的逻辑,如是否 Commit、Rollback 等协调活动。
2)Store:存储模块,用来将我们的数据持久化,防止重启或者宕机数据丢失。
3)Discover:服务注册/发现模块,用于将 Server 地址暴露给 Client。
4)Config:用来存储和查找服务端的配置。
5)Lock:锁模块,用于给 Seata 提供全局锁的功能。
6)Rpc:用于和其他端通信。
7)HA-Cluster:高可用集群,目前还没开源。为 Seata 提供可靠的高可用功能。
-
核心组件
TC: 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚(server端)。
TM: 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议(client端)。
RM:控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚(client端)。
image
开启全局事物
以@GlobalTransactional为入口,GlobalTransactionalInterceptor为切入点,稍后会讲到
TM会向TC发起一个请求(服务端使用的netty)开启一个全局事物,生成全局事物的XID,通过服务调用链路传播
开启分支事物
执行业务代码,准备开启分支事物。
分支事物开启的原理:
1.由于seata对底层的DataSource,Connection等使用DataSourceProxy,ConnectionProxy代理
2.当进行数据库操作的时候,ConnectionProxy会判断是否包含全局事物
2.1 包含全局食物
2.1.1 RM向TC发起请求注册分支事物
2.1.2 插入回滚日志(undo_log表,业务库必须新建这个表)
2.1.3 事物提交
2.1.4 向TC上报事物状态
2.2 不包含全局事物
2.2.1 事物提交