Skip to content
当前页

分布式事务

分布式事务服务(Global Transaction Service,简称 GTXS)是一款高性能、高可靠、接入成本低的分布式事务中间件,用于解决分布式环境下的数据一致性问题。全面支持TCC、补偿模式、事务消息等多种模式。支持业务无侵入的框架托管事务(FMT)模式,极大降业务接入成本。

使用流程

应用开发人员使用GTXS实现分布式事务,需要先下载GTXS SDK进行业务开发,应用部署时需要指定事务分组,事务分组可以是平台默认的分组,或者是项目管理员自定义的事务分组;应用部署后在业务请求过程中,会创建事务、事务提交、事务回滚、事务重试等行为,此时项目管理员可以在GTXS管控平台可以查看到事务信息,同时对异常事务进行手工处理。

image-20240717153643610

事务分组管理

创建事务分组

事务分组是分布式事务中数据隔离的单元,在使用分布式事务前需要先创建事务分组。

输入事务分组名称即可创建事务分组:

事务分组创建成功后会生成需要使用分组ID(groupId)作为分组的唯一标识,后续在配置文件中需要使用该ID。

删除事务分组

如该事务分组已不再使用,可以删除该事务分组。删除事务分组之后数据不再保留,请您在删除前特别注意。

事务监控

在概览页面可以查看当前项目下的当天事务监控信息,包括活动全局事务数、失败全局事务数、活动全局事务分支数、失败全局事务分支数

其中:

  • 活动全局事务数:所有没有处于初始化超时、提交成功和回滚成功状态的全局事务总和。

  • 失败全局事务数: 初始化超时、提交超时和回滚超时状态的全局事务总和。

  • 活动全局事务分支数:所有没有处于提交成功和回滚成功的事务的分支数总和

  • 失败全局事务分支数:所有提交超时和回滚超时状态的全局事务中失败分支之和

点击对应的监控数据可以跳转至对应的全局事务或异常事务列表

全局事务管理

在全局事务管理中您可以查看全局事务及其对应的分支事务的列表,查看全局事务及其状态,并通过一定的条件筛选和搜索出符合条件的全局事务。

分布式事务服务支持通过以下方式对全局事务进行搜索或筛选

  • 事务分组名称:事务所属的分组名称。

  • 事务实例名:事务发起者方法名称。

  • 事务别名:用于标识事务的业务用途(支付、下单)的别名

  • 应用名:事务发起者 Appname 参数。

  • 活动事务:指没有处于初始化超时、提交成功和回滚成功状态的全局事务

  • 全局事务状态:全局事务的状态包括 初始化中、初始化成功、初始化失败、初始化超时、提交中、提交成功、提交失败、回滚中、回滚成功和回滚失败。

  • 事务ID(XID):全局事务的唯一ID,在使用XID搜索时,其他条件设置无效。

当事务的处理时间超过了超时时限或发生错误后,系统会认为事务已处于超时或错误状态。针对超时或错误事务,GTXS提供了两种运维操作:重试和手动重试。

  • 重试:当事务超时时,框架自动重试,

  • 手动重试:用户可以在控制台上,通过鼠标点击的方式触发重试。

点击全局事务中的应用名称,可查看相应的全局事务信息和事务轨迹

事务轨迹中包括事务各个阶段的信息、分布式事务的开启、结束时间、发起方、参与方信息、事务操作过程,包括开启、提交和回滚、事务参与方类型或方法名称,如果事务执行报错,会在轨迹中显示具体错误信息,便于用户排查问题。

image-20240717154037395

异常事务处理

在异常事务管理中,用户可以查看错误处于异常状态的全局事务和分支事务,并进行相应的运维操作

当事务的处理时间超过了超时时限或发生错误后,系统会认为事务已处于超时或错误状态。针对超时或错误事务,GTXS提供了两种运维操作:重试和手动重试。

  • 重试:当事务超时时,框架自动重试,

  • 手动重试:用户可以在控制台上,通过鼠标点击的方式触发重试。

点击异常信息可以查看到异常的类型和异常的message。

SDK使用说明

应用代码部署(以springboot为例)

引入Maven依赖:(http://192.102.22.244:8081/repository/maven-public/)

  1. <dependency>

  2. <groupId>com.netease.cloud.gtxs</groupId>

  3. <artifactId>gtxs-all</artifactId>

  4. <version>${gtxs-version}</version>

  5. </dependency>

  6. <dependency>

  7. <groupId>com.netease.cloud.gtxs</groupId>

  8. <artifactId>gtxs-spring-boot-starter</artifactId>

  9. <version>${gtxs-version}</version>

  10. </dependency>

配置文件增加GTXS相关配置项:

  1. #事务分组ID,登录微服务治理控制台创建事务分组

  2. spring.application.name=order-local-test

  3. gtxs.client.txGroupId=xxx

  4. gtxsgtxsgtxs.server.address=gtxs-server.qa-ci.service.163.org:9627

声明GTXS初始化Bean:

  1. @Configuration

  2. public class GtxsConfig {

  3. /*

  4. GTXS-Server的域名,微服务治理分布式事务用户

  5. 向导页面可以看到,注意每个部署环境都不同

  6. */

  7. @Value("${gtxs.server.address}")

  8. private String serverAddress;

  9. // 应用名称,也是在注册中心注册的名称

  10. @Value("${spring.application.name}")

  11. private String appName;

  12. // 微服务治理控制台创建groupId

  13. @Value("${gtxs.client.txGroupId}")

  14. private String groupId;

  15. @Bean(name = "componentScanner")

  16. @Qualifier("componentScanner")

  17. public ComponentScanner getComponentScanner() {

  18. return new ComponentScanner(groupId, serverAddress, appName);

  19. }

  20. }

工程代码实例加入注解:

  1. @GtxsTransaction(name = "order")

  2. publi c void createOrder() {

  3. ...

  4. }

初始化数据库

  1. CREATE TABLE `gtxs_log` (

  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',

  3. `xid` varchar(64) NOT NULL COMMENT '全局事务id',

  4. `branch_id` varchar(64) NOT NULL COMMENT '分支事务id',

  5. `rollback_info` longtext NOT NULL COMMENT '回滚日志',

  6. `status` tinyint(4) NOT NULL,

  7. `create_time` bigint(20) NOT NULL,

  8. `db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  9. PRIMARY KEY (`id`),  UNIQUE KEY `unq_xid_branch_id` (`xid`,`branch_id`)

  10. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='transaction log' ;

详细使用请参考分布式事务开发手册

上次更新: