Seata 的 Transaction Coordinator (TC) 是分布式事务架构中的核心组件之一,它负责管理全局事务的生命周期,包括事务的创建、状态维护以及协调各分支事务的提交和回滚。以下是有关 TC 的详细解析及其配置和使用方法:
1. TC 的核心功能
-
全局事务管理:
- TC 记录全局事务(Global Transaction)的状态,包括开始、提交和回滚。
- 为每个全局事务分配一个唯一的事务 ID(
XID
)。
-
分支事务协调:
- TC 维护每个全局事务下的分支事务列表。
- 协调分支事务的注册、提交和回滚。
-
事务状态维护:
- TC 持久化事务状态到数据库,确保分布式事务的可靠性。
-
事务超时与清理:
- 如果全局事务长时间未完成,TC 会主动清理超时事务。
2. TC 的工作流程
-
全局事务的创建:
- Transaction Manager ™ 请求 TC 开启全局事务。
- TC 生成一个唯一的全局事务 ID (
XID
)。
-
分支事务的注册:
- Resource Manager (RM) 在执行分支事务前向 TC 注册。
- TC 将分支事务与全局事务绑定。
-
分支事务的状态更新:
- 分支事务完成后,RM 向 TC 报告状态(成功或失败)。
- TC 更新分支事务状态。
-
全局事务的提交或回滚:
- TM 通知 TC 提交或回滚全局事务。
- TC 根据分支事务的状态协调 RM 进行提交或回滚操作。
3. TC 的部署与配置
3.1 环境准备
下载 Seata Server
从 Seata 官方 GitHub 下载最新版本。
配置文件修改
-
registry.conf
配置 Seata 的注册中心和配置中心。示例(Nacos):
registry { type = "nacos" nacos { serverAddr = "127.0.0.1:8848" namespace = "" group = "SEATA_GROUP" } } config { type = "nacos" nacos { serverAddr = "127.0.0.1:8848" namespace = "" group = "SEATA_GROUP" dataId = "seata.properties" } }
-
file.conf
配置事务日志存储。示例(数据库):
store { mode = "db" # 使用数据库存储事务日志 db { datasource = "druid" dbType = "mysql" driverClassName = "com.mysql.cj.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:3306/seata" user = "root" password = "root" } }
3.2 数据库表配置
如果 TC 使用数据库模式,需要创建以下表:
-
global_table
存储全局事务信息。CREATE TABLE global_table ( xid VARCHAR(128) NOT NULL, transaction_id BIGINT, status TINYINT, gmt_create TIMESTAMP, gmt_modified TIMESTAMP, PRIMARY KEY (xid) );
-
branch_table
存储分支事务信息。CREATE TABLE branch_table ( branch_id BIGINT, xid VARCHAR(128) NOT NULL, resource_group_id VARCHAR(32), resource_id VARCHAR(256), branch_type VARCHAR(8), status TINYINT, client_id VARCHAR(64), application_data TEXT, gmt_create TIMESTAMP, gmt_modified TIMESTAMP, PRIMARY KEY (branch_id) );
-
lock_table
存储分布式事务锁。CREATE TABLE lock_table ( row_key VARCHAR(128) NOT NULL, xid VARCHAR(128), transaction_id BIGINT, branch_id BIGINT, resource_id VARCHAR(256), gmt_create TIMESTAMP, gmt_modified TIMESTAMP, PRIMARY KEY (row_key) );
3.3 启动 Seata Server
在 Seata 解压目录中执行以下命令启动 TC 服务:
sh bin/seata-server.sh -p 8091
参数说明:
-p
:指定服务端口。-m
:指定存储模式(默认file
,可设置为db
)。
4. TC 的高可用部署
4.1 多节点集群部署
Seata 支持多节点集群部署,通过注册中心(如 Nacos、Eureka)实现。
配置集群节点
在 conf/cluster.conf
文件中配置多个节点:
192.168.1.101:8091
192.168.1.102:8091
192.168.1.103:8091
配置注册中心
确保所有节点的 registry.conf
指向同一个注册中心(如 Nacos)。
4.2 数据库高可用
- 配置数据库主从复制或使用分布式数据库(如 TiDB)。
- 在
file.conf
中配置数据源连接池(如 HikariCP 或 Druid)。
5. TC 的运行与调试
查看 TC 日志
- Seata Server 的日志文件默认保存在
logs/seata.log
中。 - 关注以下关键日志:
- 全局事务的创建与状态变更。
- 分支事务的注册与状态报告。
- 超时事务的清理。
配置日志级别
在 conf/logback.xml
中配置日志级别为 DEBUG 或 INFO:
<root level="DEBUG">
<appender-ref ref="Console"/>
<appender-ref ref="File"/>
</root>
6. TC 的实践建议
-
高可用:
- 使用集群模式部署 TC,避免单点故障。
- 确保数据库的高可用性,防止数据丢失。
-
事务超时配置:
- 设置合理的事务超时时间,避免长时间占用资源。
- 配置项(在
application.yml
中):seata: service: vgroup-mapping: my_tx_group: default client: transaction: timeout: 60000 # 单位:毫秒
-
监控与调试:
- 使用 Seata 控制台(
seata-console
)监控事务状态。 - 定期清理过期事务和日志文件。
- 使用 Seata 控制台(
-
优化性能:
- 配置数据库连接池(如 Druid)提升数据库操作性能。
- 在高并发场景下,优化锁表(
lock_table
)的索引设计。
7. TC 与 TM、RM 的交互流程
-
全局事务创建
- TM 调用 TC 的
begin
接口,创建全局事务。 - TC 返回
XID
,作为事务标识。
- TM 调用 TC 的
-
分支事务注册
- RM 在执行本地事务前向 TC 注册分支事务。
- TC 返回注册成功的状态。
-
事务状态更新
- RM 向 TC 报告分支事务的执行结果(成功或失败)。
- TC 更新分支事务的状态。
-
全局事务提交或回滚
- TM 通知 TC 提交或回滚全局事务。
- TC 通知所有相关 RM 执行分支事务的提交或回滚。