一、Fescar简介
Fescar是阿里巴巴开源的分布式事务中间件,以高效并且对业务0侵入的方式,解决微服务场景下面临的分布式事务问题。
官方介绍:https://github.com/seata/seata/wiki/%E6%A6%82%E8%A7%88
二、设计思路
- 通过API调用服务A,服务A中先对数据库A进行插入操作,然后通过feign调用服务B,在服务B中对数据库B进行插入操作,调用服务B完成后,此时数据库A和数据库B中都有新插入的记录,接着服务A中抛出异常,此时数据库A与数据库B中的数据都应该回滚,即最终都没有新插入的记录
三、开发环境
(一)软件版本
环境 | 版本 | 备注 |
---|---|---|
操作系统 in PC | Window 10 企业版 | 安装JDK、VMWare、Maven、Intellij IDEA |
操作系统 in VMWare | CentOS Linux release 7.6.1810 | 安装Docker |
VMWare | 15.0.0 build-10134415 | |
Intellij IDEA | IntelliJ IDEA 2018.3.2 (Ultimate Edition) | |
JDK in PC | 1.8.0_171 | |
JDK in VMWare | 1.8.0_201 | |
Maven | 3.5.3 | |
MySQL | 8.0.15 | VMware中Docker镜像安装 |
Docker in VMWare | 18.09.4 | |
(二)第三方库版本 | ||
名称 | 版本 | 备注 |
- | - | - |
SpringBoot | 1.5.15.RELEASE | |
SpringCloud | Edgware.SR4 | |
Lombok | 1.16.20 | |
Fescar | 0.4.1 | |
Druid | 1.1.15 | |
Mybatis-spring | 1.2.2 |
四、准备工作
(一)MySQL
1.创建2个数据库:test_a和test_b
2.在test_a数据库中:
(1)创建表t_test_a:
-- ----------------------------
-- Table structure for t_test_a
-- ----------------------------
DROP TABLE IF EXISTS `t_test_a`;
CREATE TABLE `t_test_a` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
(2)创建表undo_log:
-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
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,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime(0) NULL,
`log_modified` datetime(0) NULL,
`ext` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_unionkey`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 192 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
3.在test_b数据库中:
(1)创建表t_test_b:
-- ----------------------------
-- Table structure for t_test_b
-- ----------------------------
DROP TABLE IF EXISTS `t_test_b`;
CREATE TABLE `t_test_b` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
(2)创建表undo_log:
-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREAT