Seata 是一款开源的分布式事务框架。致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各业务单元业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。
Seata:https://seata.io/zh-cn/index.html
发展史
seata的github地址:https://github.com/seata/seata
Seata 中有三大模块,分别是 TM、RM 和 TC。其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署。
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
在 Seata 中,分布式事务的执行流程:
(1)导入lagou_parent工程
(2) 执行初始化SQL脚本,首先创建4个数据库
seata_bussiness/seata_order/seata_points/seata_storage,在各自数据库执行SQL脚本
seata_order数据库
- SET NAMES utf8mb4;
-
- SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
- -- Table structure for t_order
- -- ----------------------------
- DROP TABLE
- IF
- EXISTS `t_order`;
- CREATE TABLE `t_order` (
- `id` BIGINT ( 0 ) NOT NULL COMMENT '订单id',
- `goods_Id` INT ( 0 ) NULL DEFAULT NULL COMMENT '商品ID',
- `num` INT ( 0 ) NULL DEFAULT NULL COMMENT '商品数量',
- `money` DECIMAL ( 10, 0 ) NULL DEFAULT NULL COMMENT '商品总⾦额',
- `create_time` datetime ( 0 ) NULL DEFAULT NULL COMMENT '订单创建时间',
- `username` VARCHAR ( 50 ) CHARACTER
- SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '⽤户名称',
- PRIMARY KEY ( `id` ) USING BTREE
- ) ENGINE = INNODB AUTO_INCREMENT = 49 CHARACTER
- SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
- -- Records of t_order
- -- ----------------------------
-
- SET FOREIGN_KEY_CHECKS = 1;
seata_points数据库
-
- SET NAMES utf8mb4;
-
- SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
- -- Table structure for t_points
- -- ----------------------------
- DROP TABLE
- IF
- EXISTS `t_points`;
- CREATE TABLE `t_points` (
- `id` INT ( 0 ) NOT NULL AUTO_INCREMENT COMMENT '积分ID',
- `username` VARCHAR ( 50 ) CHARACTER
- SET utf8 COLLATE utf8_bin NOT NULL COMMENT '⽤户名',
- `points` INT ( 0 ) NULL DEFAULT NULL COMMENT '⽤户积分',
- PRIMARY KEY ( `id` ) USING BTREE
- ) ENGINE = INNODB AUTO_INCREMENT = 3 CHARACTER
- SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
- -- Records of t_points
- -- ----------------------------
-
- SET FOREIGN_KEY_CHECKS = 1;
seata_storage数据库
-
- SET NAMES utf8mb4;
-
- SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
- -- Table structure for t_storage
- -- ----------------------------
- DROP TABLE
- IF
- EXISTS `t_storage`;
- CREATE TABLE `t_storage` (
- `id` INT ( 0 ) NOT NULL AUTO_INCREMENT COMMENT '库存ID',
- `goods_id` INT ( 0 ) NULL DEFAULT NULL COMMENT '商品ID',
- `storage` INT ( 0 ) NULL DEFAULT NULL COMMENT '库存量',
- PRIMARY KEY ( `id` ) USING BTREE
- ) ENGINE = INNODB AUTO_INCREMENT = 2 CHARACTER
- SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
- -- Records of t_storage
- -- ----------------------------
- INSERT INTO `t_storage`
- VALUES
- ( 1, 1, 100 );
-
- SET FOREIGN_KEY_CHECKS = 1;
(3)案例测试
依次将4个服务启动.和nacos服务
访问路径为:
http://localhost:8000/test1 正常访问数据分别入库
http://localhost:8000/test2 访问出错库存不足,导致服务调用失败.则观察数据库, 经发现订单与积分数据库都已改变,而库存数据库没有减少库存, 所以不满足事务的特性
原始代码下载地址:链接:https://pan.baidu.com/s/1onKBiLQ8x11bPHxxdMv2VQ?pwd=gjc5