**一.分布式常见三种场景**
1.跨数据库分布式事务
2.跨服务分布式事务
3.混合式分布式事务
**二.事务的四大特性**
Atomicity:原子性,事务中的所有操作要么都成功执行,要么都取消执行,不能存在部分执行,部分不执行的状态。
Consistency:一致性,举个例子简单的理解就是,A、B 两个账户各有 100 元,无论两个账户并发相互转账多少次,两个账户的资金总额依然是 200 元。
Isolation:隔离性,并发事务之间的相互影响程度,隔离性也是分级别的:读未提交、读已提交、可重复读等。
Durability:持久性,事务完成后对数据的更改不会丢失。
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 相关
file.conf配置
file.conf.example配置
配置好相关的文件后,如果是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等
1.成功clien端连接注册到服务端的结果
服务端成功显示三个clien端注册成功
clien端我只拿一个order模块代码,其他代码同理都是一样
2.java代码解析以及验证是否成功回滚结果
order 模块代码
account模块
storage模块
服务端回滚日志
订单回滚日志
库存以及账户同理 回滚日志
统一都实现了三个模块回滚
由于官网demo使用的是spring-cloud-alibaba-seata整合,所以不用考虑xid传递问题,自动传递xid
作者使用的是springboot整合,需要手动传递xid给其他被feign调用模块,使用的方法是在请求头中添加xid标识。
以上就是整个使用过程以及踩坑结果,有问题可以留言作者,会及时回答各位问题,希望大家多多支持!!
参考文献有以下
搭建相关文档: seata官方文档
cilen端相关配置内容: application.yml相关配置内容
官方demo: github案例
添加feign请求头内容:链接: feign添加请求头
-----------------以上很多都是在许多大佬各种资料总结的情况下踩坑完毕-------------------------------