# spring-cloud-starter-rdtx **Repository Path**: rdtx/spring-cloud-starter-rdtx ## Basic Information - **Project Name**: spring-cloud-starter-rdtx - **Description**: 适配rdtx-core分布式事务框架的spring-cloud-starter,提供了RdtxAutoConfiguration。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-19 - **Last Updated**: 2025-12-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 示意图 ![通信示意图](./通信图.png) ## 术语说明 - TM 借鉴Seata的命名,表示事务发起者(TransactionManager) - RM 借鉴Seata的命名,表示事务参与者(ResourceManager) ## 完整的流程说明 ### 成功的情况 - 客户端请求到达发起者。发起者判断当前RdtxContext中没有rdtx-id,主动创建一个,作为本次请求贯穿全局的事务id,角色为TM。 - 发起者通过RestTemplate或Feign等方式,调用后端微服务,通过相应的方式传递rdtx-id。 - 参与者接收到请求,通过Filter读取上游传递的rdtx-id,作为本次请求的事务id,角色为RM。 - 发起者发布全局提交事件到redis主题。 - 参与者收到提交事件,对事务进行提交。 - 发起者结束请求,返回成功错误码、报文。 ### 失败的情况 - 客户端请求到达发起者。发起者判断当前RdtxContext中没有rdtx-id,主动创建一个,作为本次请求贯穿全局的事务id,角色为TM。 - 发起者通过RestTemplate或Feign等方式,调用后端微服务,通过相应的方式传递rdtx-id。 - 参与者接收到请求,通过Filter读取上游传递的rdtx-id,作为本次请求的事务id,角色为RM。 - 不管是参与者异常回滚,还是发起者异常回滚,最终体现为发起者回滚,由发起者发布全局回滚事件到redis主题。 - 参与者收到回滚事件,对事务进行回滚。 - 发起者结束请求,返回失败错误码、报文。 ### 补充说明 - 通过RestTemplate传递rdtx-id,也就是实现ClientHttpRequestInterceptor接口,添加header - 通过Feign传递rdtx-id,也就是实现RequestInterceptor接口,也是添加header - 发起者自身的回滚自己负责,参与者自身的异常回滚自己负责,不依赖redis回滚事件。 - 存在短暂的毫秒级时间差,发起者已经返回,但参与者事务还没有提交或回滚,但保证最终一致性。 - 发起者与参与者不是固定的,每个服务都可以是发起者,也可以是参与者,取决于是不是第一个接收请求。 ## 连接管理器 ​ 对于参与者来说,事务二阶段提交或回滚是异步进行的,所以需要连接保持,定义了一个连接管理器,将数据库connection与全局事务rdtx-id进行绑定,在二阶段提交或回滚时,挨个取出来进行commit或rollback调用。 ## 连接代理 ​ 为阻止数据库连接默认的提交行为,对Connection进行代理。 ​ 在连接的commit中,如果是发起者,则发布全局事务提交事件;如果是参与者,则将当前连接加入到连接管理器。 ​ 在连接的rollback中,如果是发起者,则发布全局事务回滚事件;如果是参与者,直接回滚。 ## 二阶段提交/回滚 ​ 二阶段操作,对于发起者和参与者无差别对待(因为就算是发起者,也可能被二次调用到),都是从连接管理器中查找rdtx-id对应的连接对象数组,挨个提交/回顾。 ## 分支信息监控 ​ 框架提供了一个简易版的分支信息监控(包括发起者、参与者),用于跟踪分支事务详情。他会记录到key为rdtx-list:${rdtx-id}的redis list对象中,分支事务信息对象包括基础的应用名、ip、端口、角色,及应用个性化扩展RdtxBranchInfo::extendBranchInfo扩展的事务信息,方便进行调试。为了避免占用过多redis空间,此监控信息默认保存10分钟。