springboot+seata+eureka分布式事务搭建以及使用完整案例

springboot+seata+eureka分布式事务搭建以及使用完整案例

    • 一.分布式三种场景
    • 二.准备安装工作以及所需数据
    • 三.测试结果以及使用过程
    • 四.特别注意的地方

一.分布式三种场景

	**.分布式常见三种场景**
	1.跨数据库分布式事务
	2.跨服务分布式事务
	3.混合式分布式事务
	**.事务的四大特性**
	Atomicity:原子性,事务中的所有操作要么都成功执行,要么都取消执行,不能存在部分执行,部分不执行的状态。
	Consistency:一致性,举个例子简单的理解就是,AB 两个账户各有 100 元,无论两个账户并发相互转账多少次,两个账户的资金总额依然是 200 元。
	Isolation:隔离性,并发事务之间的相互影响程度,隔离性也是分级别的:读未提交、读已提交、可重复读等。
	Durability:持久性,事务完成后对数据的更改不会丢失。

springboot+seata+eureka分布式事务搭建以及使用完整案例_第1张图片

二.准备安装工作以及所需数据

seata支持(AT,TCC,Saga等模式) 这次使用的是AT模式

特别强调~~seata分为服务端以及clien客户端

百度网盘链接:https://pan.baidu.com/s/19s2FeAlLWjWrEnWTjEucxg 
提取码:x6el 提取seata-server

1.seata-server 服务端相关配置(表结构)
-- 全局事务表
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- 分支事务表
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- 存储锁表
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(96),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

2.file.conf 和 registry.conf以及 file.conf.example 相关配置
registry.conf 相关
springboot+seata+eureka分布式事务搭建以及使用完整案例_第2张图片
file.conf配置
springboot+seata+eureka分布式事务搭建以及使用完整案例_第3张图片
file.conf.example配置
springboot+seata+eureka分布式事务搭建以及使用完整案例_第4张图片
配置好相关的文件后,如果是win环境启动seata-server.bat,如果是linux环境则启动seata-server.sh,服务端则配置完成,接下来是客户端

个人搭建的springcloud+eureka+seata的案例,作为seata的clien端,配置好直接操作demo 
百度网盘链接:https://pan.baidu.com/s/1ouAheXCNrKgnB12KqWln8g 
提取码:61v2 

1.客户端相关配置信息,sql脚本

-- 账户表
 CREATE TABLE `account` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` bigint(11) DEFAULT NULL COMMENT '用户id',
  `total` decimal(10,0) DEFAULT NULL COMMENT '总额度',
  `used` decimal(10,0) DEFAULT NULL COMMENT '已用余额',
  `residue` decimal(10,0) DEFAULT '0' COMMENT '剩余可用额度',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `account` (`id`, `user_id`, `total`, `used`, `residue`) VALUES ('1', '1', '1000', '0', '100');

-- 订单表
CREATE TABLE `order` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `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,0) DEFAULT NULL COMMENT '金额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
ALTER TABLE `order` ADD COLUMN `status` int(1) DEFAULT NULL COMMENT '订单状态:0:创建中;1:已完结' AFTER `money` ;

-- 库存表
CREATE TABLE `storage` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `product_id` bigint(11) DEFAULT NULL COMMENT '产品id',
  `total` int(11) DEFAULT NULL COMMENT '总库存',
  `used` int(11) DEFAULT NULL COMMENT '已用库存',
  `residue` int(11) DEFAULT NULL COMMENT '剩余库存',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `seat-storage`.`storage` (`id`, `product_id`, `total`, `used`, `residue`) VALUES ('1', '1', '100', '0', '100');

-- 最重要的,本地事务以及补偿sql 撤销日志 如果分库,每个业务库都需要录入一份
CREATE TABLE `undo_log`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime(0) NOT NULL,
  `log_modified` datetime(0) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8;

以上是相关的表结构数据

2.clien端相关配置文件内容
application.yml 相关内容,seata以及eureka等
springboot+seata+eureka分布式事务搭建以及使用完整案例_第5张图片

三.测试结果以及使用过程

1.成功clien端连接注册到服务端的结果
服务端成功显示三个clien端注册成功
springboot+seata+eureka分布式事务搭建以及使用完整案例_第6张图片
clien端我只拿一个order模块代码,其他代码同理都是一样
在这里插入图片描述

2.java代码解析以及验证是否成功回滚结果

order 模块代码
springboot+seata+eureka分布式事务搭建以及使用完整案例_第7张图片
account模块
springboot+seata+eureka分布式事务搭建以及使用完整案例_第8张图片
storage模块
springboot+seata+eureka分布式事务搭建以及使用完整案例_第9张图片
服务端回滚日志
springboot+seata+eureka分布式事务搭建以及使用完整案例_第10张图片
订单回滚日志
springboot+seata+eureka分布式事务搭建以及使用完整案例_第11张图片
库存以及账户同理 回滚日志
springboot+seata+eureka分布式事务搭建以及使用完整案例_第12张图片
统一都实现了三个模块回滚

四.特别注意的地方

由于官网demo使用的是spring-cloud-alibaba-seata整合,所以不用考虑xid传递问题,自动传递xid

作者使用的是springboot整合,需要手动传递xid给其他被feign调用模块,使用的方法是在请求头中添加xid标识。
springboot+seata+eureka分布式事务搭建以及使用完整案例_第13张图片
springboot+seata+eureka分布式事务搭建以及使用完整案例_第14张图片

以上就是整个使用过程以及踩坑结果,有问题可以留言作者,会及时回答各位问题,希望大家多多支持!!

参考文献有以下

搭建相关文档: seata官方文档
cilen端相关配置内容: application.yml相关配置内容
官方demo: github案例
添加feign请求头内容:链接: feign添加请求头
-----------------以上很多都是在许多大佬各种资料总结的情况下踩坑完毕-------------------------------

你可能感兴趣的:(java,spring,boot,分布式)