RocketMQ实现可靠消息最终一致性
业务说明
本实例通过RocketMQ中间件实现可靠消息最终一致性分布式事务,模拟两个账户的转账交易过程。
两个账户在分别在不同的银行(张三在bank1、李四在bank2),bank1、bank2是两个微服务。
交易过程是,张三 给李四转账指定金额。
上述交易步骤,张三扣减金额与给bank2发转账消息,两个操作必须是一个整体性的事务。
程序组成部分
数据库:MySQL-8.X (包括bank1和bank2 两个数据库)
JDK:1.8.X
微服务框架:SpringBoot2.3、SpringCloudHoxton
RocketMQ:rocketmq-spring-boot-starter.2.0.4
微服务及数据库的关系:
dtx/rocker-bank-mq/bank1-server-mq 银行1 操作张三用户,连接bank1
dtx/rocker-bank-mq/bank2-server-mq 银行2 操作李四用户,连接bank2
创建数据库
bank1库,包含张三的账户
DROP DATABASE IF EXISTS `bank1`;
CREATE DATABASE `bank1` CHARACTER SET 'utf8mb4';
USE `bank1`;
DROP TABLE IF EXISTS `account_info`;
CREATE TABLE `account_info` (
id bigint ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键',
account_name VARCHAR ( 100 ) COMMENT '账户姓名',
account_no VARCHAR ( 100 ) COMMENT '账户卡号',
account_password VARCHAR ( 100 ) COMMENT '账户密码',
account_balance DECIMAL ( 10,2) COMMENT '账户余额',
PRIMARY KEY ( id )
) COMMENT = '账户表';
INSERT INTO `account_info` VALUES ('1' , '张三的账户','1', '', 10000 );
bank2库,包含李四的账户
DROP DATABASE IF EXISTS `bank2`;
CREATE DATABASE `bank2` CHARACTER SET 'utf8mb4';
USE `bank2`;
DROP TABLE IF EXISTS `account_info`;
CREATE TABLE `account_info` (
id bigint ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键',
account_name VARCHAR ( 100 ) COMMENT '账户姓名',
account_no VARCHAR ( 100 ) COMMENT '账户卡号',
account_password VARCHAR ( 100 ) COMMENT '账户密码',
account_balance DECIMAL ( 10,2) COMMENT '账户余额',
PRIMARY KEY ( id )
) COMMENT = '账户表';
INSERT INTO `account_info` VALUES ('1' , '李四的账户','2', '', 0);
每个数据库都创建 de_duplication
DROP TABLE IF EXISTS `de_duplication`;
CREATE