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;


浙公网安备 33010602011771号