youlai-mall项目中的Seata分布式事务表结构解析
前言
在分布式系统中,事务管理是一个复杂且关键的问题。youlai-mall项目采用了Seata作为分布式事务解决方案,通过分析其数据库表结构设计,我们可以深入了解Seata如何实现分布式事务管理。
Seata数据库表结构概述
Seata在数据库层面设计了四张核心表来支持分布式事务的运作:
global_table
- 全局事务表branch_table
- 分支事务表lock_table
- 全局锁表distributed_lock
- 分布式锁表
这些表共同构成了Seata的事务管理基础,下面我们逐一分析每张表的设计和作用。
全局事务表(global_table)
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
关键字段解析:
xid
:全局事务ID,是分布式事务的唯一标识transaction_id
:事务IDstatus
:事务状态,使用TINYINT类型表示不同的事务状态application_id
:应用ID,标识发起事务的应用transaction_service_group
:事务服务分组timeout
:事务超时时间begin_time
:事务开始时间,使用BIGINT存储时间戳
索引设计:
- 主键索引:
xid
- 联合索引:
idx_status_gmt_modified
,用于按状态和时间查询 - 普通索引:
idx_transaction_id
,用于按事务ID查询
分支事务表(branch_table)
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
关键字段解析:
branch_id
:分支事务IDxid
:关联的全局事务IDresource_id
:资源ID,标识分支事务操作的资源branch_type
:分支事务类型status
:分支事务状态
索引设计:
- 主键索引:
branch_id
- 普通索引:
idx_xid
,用于按全局事务ID查询关联的分支事务
全局锁表(lock_table)
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`),
KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
关键字段解析:
row_key
:行键,唯一标识锁记录table_name
:加锁的表名pk
:加锁的主键值status
:锁状态,0表示锁定,1表示回滚中
索引设计:
- 主键索引:
row_key
- 普通索引:
idx_status
,idx_branch_id
- 联合索引:
idx_xid_and_branch_id
分布式锁表(distributed_lock)
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
`lock_key` CHAR(20) NOT NULL,
`lock_value` VARCHAR(20) NOT NULL,
`expire` BIGINT,
primary key (`lock_key`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
关键字段解析:
lock_key
:锁的键名lock_value
:锁的值expire
:过期时间
初始化数据:
- AsyncCommitting:异步提交锁
- RetryCommitting:重试提交锁
- RetryRollbacking:重试回滚锁
- TxTimeoutCheck:事务超时检查锁
表结构设计特点分析
- 字符集选择:全部使用utf8mb4字符集,支持完整的Unicode字符集,包括emoji表情
- 存储引擎:使用InnoDB引擎,支持事务和行级锁
- 时间精度:
branch_table
中的时间字段使用DATETIME(6)支持微秒级精度 - 索引设计:针对常见查询场景设计了合理的索引,如按状态查询、按事务ID查询等
在youlai-mall中的应用
在youlai-mall项目中,这些表结构为分布式事务提供了基础支持:
- 订单创建:当用户下单时,可能涉及库存扣减、订单创建、支付等多个服务,Seata通过这些表协调各个服务的事务
- 库存管理:保证在多服务并发操作库存时的数据一致性
- 支付处理:确保支付成功后的订单状态更新和库存扣减的原子性
总结
通过分析youlai-mall项目中Seata的数据库表结构,我们可以了解到:
- Seata通过
global_table
和branch_table
实现了全局事务和分支事务的管理 lock_table
提供了全局锁机制,防止并发事务导致的数据不一致distributed_lock
表实现了分布式锁,用于协调不同事务处理器的操作
这些表结构设计合理,索引配置得当,能够有效支持youlai-mall项目中的分布式事务场景,确保系统在高并发情况下的数据一致性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考