# 分布式事务-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)。
订单表生成对应订单。
# 事务回滚
事务提交失败,订单服务,账户服务,库存服务对应的库表数据回滚。