# 分布式事务-seata

通过seata at模式实现分布式事务。

# TC事务协调者

tc事务协调者对应一个web服务,这里我们使用的tc是seata-server-1.4.2,找到项目的bin目录,双击执行seata-server.bat脚本即可完成tc的启动。

可以看到服务使用8091端口启动。

# 建库建表

在需要做分布式事务的数据库中进行相关建表语句,每个库都需要创建undo_log表。

相关建库建表语句
CREATE DATABASE `seata`;

CREATE TABLE `account_tbl`
(
    `id`      int(11) NOT NULL AUTO_INCREMENT,
    `user_id` varchar(255) DEFAULT NULL,
    `money`   int(11) DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `stock_tbl`
(
    `id`             int(11) NOT NULL AUTO_INCREMENT,
    `commodity_code` varchar(255) DEFAULT NULL,
    `count`          int(11) DEFAULT '0',
    PRIMARY KEY (`id`),
    UNIQUE KEY `commodity_code` (`commodity_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `order_tbl`
(
    `id`             int(11) NOT NULL AUTO_INCREMENT,
    `user_id`        varchar(255) DEFAULT NULL,
    `commodity_code` varchar(255) DEFAULT NULL,
    `count`          int(11) DEFAULT '0',
    `money`          int(11) DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
# 为undo_log表增加索引
ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);

# 修改datasource配置文件

将项目的application.properties配置文件中的datasource修改为我们实际运行的数据库。

# 验证分布式事务

运行项目验证分布式事务,如相关服务执行无异常,代码正常提交,如任意服务异常,事务回滚。

# 事务提交

事务提交成功,订单服务,账户服务,库存服务对应的库表数据同步提交。

账户表金额减少(由10000减少为400)。

库存表库存减少(由100减少为98)。

订单表生成对应订单。

# 事务回滚

事务提交失败,订单服务,账户服务,库存服务对应的库表数据回滚。




# 完整项目地址

seata分布式事务demo (opens new window)