36、SpringCloudAlibaba实战:分布式事务:Seata框架代码的完善-15800字匠心巨作

代码的完善

    • 1.数据库表导入
  • 2.模型对象和 Mapper 对象生成
  • 3.storage-service 代码的完善
    • 3.1 接口设计
    • 3.2 实现该接口
    • 3.3 使用 Restful 暴露此接口
    • 3.4 添加配置文件
    • 3.5 添加启动类
    • 3.6 启动项目测试
  • 4.account-service 代码的完善
    • 4.1 接口设计
    • 4.2 实现该接口
    • 4.3 使用 Restful 暴露此接口
    • 4.4 添加配置文件
    • 4.5 添加启动类
    • 4.6 启动项目测试
  • 5.order-service 代码的完善
    • 5.1 接口设计
    • 5.2 实现该接口
    • 5.3 远程调用 account-service 的实现
    • 5.4 Ribbon 集成
    • 5.5 使用 Restful 暴露此接口
    • 5.6 添加配置文件
    • 5.7 添加启动类
    • 5.8 启动项目测试
  • 6.business-service 代码的完善
    • 6.1 接口设计
    • 6.2 实现该接口
    • 6.3 远程调用 storage-service 的实现
    • 6.4 远程调用 order-service 的实现
    • 6.5 集成 Ribbon
    • 6.6 添加配置文件
    • 6.7 添加启动类
    • 6.8 暴露下单接口
    • 6.9 启动项目测试
  • 7.总体的调用流程如下
  • 8.正常下单测试
  • 9.分布式事务的演示
    • 9.1 在 accout-service 服务扣减余额触发异常
    • 9.2 重启 accout-service
    • 9.3 还原数据库里面的数据
    • 9.4 重新下单测试
  • 10.使用 Seata 解决分布式问题
    • 10.1 改造 accout-service 里面的 AccountServiceImpl
    • 10.2 改造 BusinessServiceImpl
    • 10.3 重启测试

1.数据库表导入

  • 在测试分布式事务之前,我们需要先设计数据库,以及准备测试数据。
  • 新建数据库,命名为:seata
    *
  • 创建表(导入 Sql)
/*
Navicat MySQL Data Transfer

Source Server         : Mysql
Source Server Version : 80019
Source Host           : localhost:3306
Source Database       : seata

Target Server Type    : MYSQL
Target Server Version : 80019
File Encoding         : 65001

Date: 2020-05-21 16:22:26
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for account_tbl
-- ----------------------------
DROP TABLE IF EXISTS account_tbl;
CREATE TABLE account_tbl (
  id int NOT NULL AUTO_INCREMENT,
  user_id varchar(255) DEFAULT NULL,
  money int DEFAULT '0',
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of account_tbl
-- ----------------------------
INSERT INTO account_tbl VALUES ('1', 'DQCGM_USER_1', '10000');
INSERT INTO account_tbl VALUES ('2', 'DQCGM_USER_2', '10000');

-- ----------------------------
-- Table structure for order_tbl
-- ----------------------------
DROP TABLE IF EXISTS order_tbl;
CREATE TABLE order_tbl (
  id int NOT NULL AUTO_INCREMENT,
  user_id varchar(255) DEFAULT NULL,
  commodity_code varchar(255) DEFAULT NULL,
  count int DEFAULT '0',
  money int DEFAULT '0',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of order_tbl
-- ----------------------------

-- ----------------------------
-- Table structure for storage_tbl
-- ----------------------------
DROP TABLE IF EXISTS storage_tbl;
CREATE TABLE storage_tbl (
  id int NOT NULL AUTO_INCREMENT,
  commodity_code varchar(255) DEFAULT NULL,
  count int DEFAULT '0',
  PRIMARY KEY (id),
  UNIQUE KEY commodity_code (commodity_code)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of storage_tbl
-- ----------------------------
INSERT INTO storage_tbl VALUES ('1', 'HUAWEI_0001', '10');
INSERT INTO storage_tbl VALUES ('2', 'XIAOMI_002', '10');

-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS undo_log;
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;

-- ----------------------------
-- Records of undo_log
-- ----------------------