44、分布式事务Seata :解决全局数据一致性问题 构建Seata的基础配置

1、Seata 的执行过程 一带三 一指的是:全局事务ID

TC:事务协调者(相当于Seata服务器)

TM:事务管理者 (@GlobalTransactional 加了这个的人)

RM:事务参与者 (相当于每一个远程调用的目标服务器的库)

Steat运行流程:

第一阶段:加载资源:生成前置镜像before image,执行业务sql,生产后置镜像after image 生产行锁

第二阶段:事务提交:当一切成功时事务发起提交,删除前置镜像产生的数据,后置镜像产生的数据

第二阶段:事务回滚:当某一个环节发生异常,发起事务回滚,对比前置镜像和后置镜像的数据,校验藏写进行回滚,删除前置镜像产生的数据,后置镜像产生的数据

2、Seata:下载和安装 本次使用seata0.9.0

找到你自己的Mysql:里面新建 seata 数据库

 在seata 库里面建三张表,执行的sql脚本不需要自己写,找到seata 配置文件夹里的sql脚本,执行之后创建三张表

 

 

 

修改:file.conf 文件  ,修改前最好先备份

 

 

 

 修改:registry.conf 文件 ,修改前最好先备份

 3、首先启动你的Nacos  然后启动 seata  bin目录下的bat文件

 

 3、创建seata 业务数据库

 首先要确保 Nacos 服务器 和Seata 服务器 正常启动

在自己的mysql中创建三个微服务的独有的三个库 ,建库脚本如下

create database seata_order;
create database seata_storage;
create database seata_account;

 在seata_order库上建 t_order 表

CREATE TABLE `t_order` (
  `id` bigint(11) NOT NULL COMMENT '主键',
  `user_id` bigint(11) DEFAULT NULL COMMENT '用户id',
  `product_id` bigint(11) DEFAULT NULL COMMENT '产品id',
  `count` int(11) DEFAULT NULL COMMENT '数量',
  `money` decimal(11,1) DEFAULT NULL COMMENT '金额',
  `status` int(1) DEFAULT NULL COMMENT '状态0:创建中,1:已完成',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

在 在seata_storage库上建 t_storage 表

CREATE TABLE `t_storage` (
  `id` bigint(11) NOT NULL COMMENT '主键',
  `product_id` bigint(11) DEFAULT NULL COMMENT '产品id',
  `total` int(11) DEFAULT NULL COMMENT '总共',
  `used` int(11) DEFAULT NULL COMMENT '已使用',
  `resdiue` int(11) DEFAULT NULL COMMENT '剩余数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

# 插入初始数据

INSERT INTO `seata_storage`.`t_storage`(`id`, `product_id`, `total`, `used`, `resdiue`) VALUES (1, 2, 100, 0, 100);

 在seata_account库上建 t_account 表

CREATE TABLE `t_account` (
`id` bigint NOT NULL COMMENT '主键',
`user_id` bigint DEFAULT NULL COMMENT '用户id',
`total` decimal(11,1) DEFAULT NULL COMMENT '总共余额',
`used` decimal(11,1) DEFAULT NULL COMMENT '花了多少钱',
`residue` decimal(11,1) DEFAULT NULL COMMENT '剩余多少',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


# 插入初始数据
INSERT INTO `seata_account`.`t_account`(`id`, `user_id`, `total`, `used`, `residue`) VALUES (1, 10, 10000, 0, 10000);

在三个库里面 分别建 日志回滚记录表,脚本不需要自己建,找到seata 配置文件下 db_undo_log.sql

 

 执行的脚本

CREATE TABLE `undo_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `branch_id` bigint NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 5、到此就完成 Seata 的基础配置

posted @ 2021-07-03 13:34  shunnWcs  阅读(720)  评论(0)    收藏  举报