youlai-mall项目中的Seata分布式事务表结构解析

youlai-mall项目中的Seata分布式事务表结构解析

前言

在分布式系统中,事务管理是一个复杂且关键的问题。youlai-mall项目采用了Seata作为分布式事务解决方案,通过分析其数据库表结构设计,我们可以深入了解Seata如何实现分布式事务管理。

Seata数据库表结构概述

Seata在数据库层面设计了四张核心表来支持分布式事务的运作:

  1. global_table - 全局事务表
  2. branch_table - 分支事务表
  3. lock_table - 全局锁表
  4. 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:事务ID
  • status:事务状态,使用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:分支事务ID
  • xid:关联的全局事务ID
  • resource_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_statusidx_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:事务超时检查锁

表结构设计特点分析

  1. 字符集选择:全部使用utf8mb4字符集,支持完整的Unicode字符集,包括emoji表情
  2. 存储引擎:使用InnoDB引擎,支持事务和行级锁
  3. 时间精度branch_table中的时间字段使用DATETIME(6)支持微秒级精度
  4. 索引设计:针对常见查询场景设计了合理的索引,如按状态查询、按事务ID查询等

在youlai-mall中的应用

在youlai-mall项目中,这些表结构为分布式事务提供了基础支持:

  1. 订单创建:当用户下单时,可能涉及库存扣减、订单创建、支付等多个服务,Seata通过这些表协调各个服务的事务
  2. 库存管理:保证在多服务并发操作库存时的数据一致性
  3. 支付处理:确保支付成功后的订单状态更新和库存扣减的原子性

总结

通过分析youlai-mall项目中Seata的数据库表结构,我们可以了解到:

  1. Seata通过global_tablebranch_table实现了全局事务和分支事务的管理
  2. lock_table提供了全局锁机制,防止并发事务导致的数据不一致
  3. distributed_lock表实现了分布式锁,用于协调不同事务处理器的操作

这些表结构设计合理,索引配置得当,能够有效支持youlai-mall项目中的分布式事务场景,确保系统在高并发情况下的数据一致性。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舒京涌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值