分布式事务
分布式事务服务(Global Transaction Service,简称 GTXS)是一款高性能、高可靠、接入成本低的分布式事务中间件,用于解决分布式环境下的数据一致性问题。全面支持TCC、补偿模式、事务消息等多种模式。支持业务无侵入的框架托管事务(FMT)模式,极大降业务接入成本。
使用流程
应用开发人员使用GTXS实现分布式事务,需要先下载GTXS SDK进行业务开发,应用部署时需要指定事务分组,事务分组可以是平台默认的分组,或者是项目管理员自定义的事务分组;应用部署后在业务请求过程中,会创建事务、事务提交、事务回滚、事务重试等行为,此时项目管理员可以在GTXS管控平台可以查看到事务信息,同时对异常事务进行手工处理。
事务分组管理
创建事务分组
事务分组是分布式事务中数据隔离的单元,在使用分布式事务前需要先创建事务分组。
输入事务分组名称即可创建事务分组:
事务分组创建成功后会生成需要使用分组ID(groupId)作为分组的唯一标识,后续在配置文件中需要使用该ID。
删除事务分组
如该事务分组已不再使用,可以删除该事务分组。删除事务分组之后数据不再保留,请您在删除前特别注意。
事务监控
在概览页面可以查看当前项目下的当天事务监控信息,包括活动全局事务数、失败全局事务数、活动全局事务分支数、失败全局事务分支数
其中:
活动全局事务数:所有没有处于初始化超时、提交成功和回滚成功状态的全局事务总和。
失败全局事务数: 初始化超时、提交超时和回滚超时状态的全局事务总和。
活动全局事务分支数:所有没有处于提交成功和回滚成功的事务的分支数总和
失败全局事务分支数:所有提交超时和回滚超时状态的全局事务中失败分支之和
点击对应的监控数据可以跳转至对应的全局事务或异常事务列表
全局事务管理
在全局事务管理中您可以查看全局事务及其对应的分支事务的列表,查看全局事务及其状态,并通过一定的条件筛选和搜索出符合条件的全局事务。
分布式事务服务支持通过以下方式对全局事务进行搜索或筛选
事务分组名称:事务所属的分组名称。
事务实例名:事务发起者方法名称。
事务别名:用于标识事务的业务用途(支付、下单)的别名
应用名:事务发起者 Appname 参数。
活动事务:指没有处于初始化超时、提交成功和回滚成功状态的全局事务
全局事务状态:全局事务的状态包括 初始化中、初始化成功、初始化失败、初始化超时、提交中、提交成功、提交失败、回滚中、回滚成功和回滚失败。
事务ID(XID):全局事务的唯一ID,在使用XID搜索时,其他条件设置无效。
当事务的处理时间超过了超时时限或发生错误后,系统会认为事务已处于超时或错误状态。针对超时或错误事务,GTXS提供了两种运维操作:重试和手动重试。
重试:当事务超时时,框架自动重试,
手动重试:用户可以在控制台上,通过鼠标点击的方式触发重试。
点击全局事务中的应用名称,可查看相应的全局事务信息和事务轨迹
事务轨迹中包括事务各个阶段的信息、分布式事务的开启、结束时间、发起方、参与方信息、事务操作过程,包括开启、提交和回滚、事务参与方类型或方法名称,如果事务执行报错,会在轨迹中显示具体错误信息,便于用户排查问题。
异常事务处理
在异常事务管理中,用户可以查看错误处于异常状态的全局事务和分支事务,并进行相应的运维操作
当事务的处理时间超过了超时时限或发生错误后,系统会认为事务已处于超时或错误状态。针对超时或错误事务,GTXS提供了两种运维操作:重试和手动重试。
重试:当事务超时时,框架自动重试,
手动重试:用户可以在控制台上,通过鼠标点击的方式触发重试。
点击异常信息可以查看到异常的类型和异常的message。
SDK使用说明
应用代码部署(以springboot为例)
引入Maven依赖:(http://192.102.22.244:8081/repository/maven-public/)
<dependency>
<groupId>com.netease.cloud.gtxs</groupId>
<artifactId>gtxs-all</artifactId>
<version>${gtxs-version}</version>
</dependency>
<dependency>
<groupId>com.netease.cloud.gtxs</groupId>
<artifactId>gtxs-spring-boot-starter</artifactId>
<version>${gtxs-version}</version>
</dependency>
配置文件增加GTXS相关配置项:
#事务分组ID,登录微服务治理控制台创建事务分组
spring.application.name=order-local-test
gtxs.client.txGroupId=xxx
gtxsgtxsgtxs.server.address=gtxs-server.qa-ci.service.163.org:9627
声明GTXS初始化Bean:
@Configuration
public class GtxsConfig {
/*
GTXS-Server的域名,微服务治理分布式事务用户
向导页面可以看到,注意每个部署环境都不同
*/
@Value("${gtxs.server.address}")
private String serverAddress;
// 应用名称,也是在注册中心注册的名称
@Value("${spring.application.name}")
private String appName;
// 微服务治理控制台创建groupId
@Value("${gtxs.client.txGroupId}")
private String groupId;
@Bean(name = "componentScanner")
@Qualifier("componentScanner")
public ComponentScanner getComponentScanner() {
return new ComponentScanner(groupId, serverAddress, appName);
}
}
工程代码实例加入注解:
@GtxsTransaction(name = "order")
publi c void createOrder() {
...
}
初始化数据库
CREATE TABLE `gtxs_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`xid` varchar(64) NOT NULL COMMENT '全局事务id',
`branch_id` varchar(64) NOT NULL COMMENT '分支事务id',
`rollback_info` longtext NOT NULL COMMENT '回滚日志',
`status` tinyint(4) NOT NULL,
`create_time` bigint(20) NOT NULL,
`db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), UNIQUE KEY `unq_xid_branch_id` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='transaction log' ;
详细使用请参考分布式事务开发手册