Seata之AT模式解决分布式事务案例(一)

本文介绍了使用Seata的AT模式解决分布式事务问题的一个案例。在案例中,创建了订单、库存和账户三个服务,当用户下单时,涉及跨数据库操作和远程调用,存在分布式事务挑战。文章详细阐述了需求背景、SEATA解决方案的架构,并提供了数据库准备的步骤,包括创建相关表及回滚日志表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

需求说明

SEATA解决方案的架构图

订单/库存/账户 数据库准备


 

需求说明

 

这 里 我 们 会 创 建 三 个 服 务 , 一 个 订 单 服 务 , 一 个库存服务 , 一 个账 户服 务 ·

当 用 户 下 单 时 , 会 在 订 单 服 务 中 创 建 一 个 订 单 , 然 后 通 过 远 程 调 用 库 存 服 务 来 扣 减 下 单 商 品 的 库 存 ,

再 通 过 远 程 调 用 账 户 服 务 来 扣 减 用 户 账 户 里 面 的 余 额 ,

最 后 在 订 单 服 务 中 修 改 订 单 状 态 为 已 完 成 ·

该 操 作 跨 越 一 个 数 据 库 , 有 两 次 远 程 调 用 , 很 明 显 会 有 分 布 式 事 务 问 题 

 

 

SEATA解决方案的架构图

 

下订单==》扣库存==》减余额==》更改订单状态

 

 

订单/库存/账户 数据库准备

 

 1.新建三个数据库

create database seata_order;
create database seata_storage;
create database seata_account;

 

2.在order库中新建order表

DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order`  (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) 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 '金额',
  `status` int(1) DEFAULT NULL COMMENT '订单状态:  0:创建中 1:已完结',
  PRIMARY KEY (`int`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic;

 

3.storage库新建storage表

DROP TABLE IF EXISTS `t_storage`;
CREATE TABLE `t_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 (`int`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '库存' ROW_FORMAT = Dynamic;
INSERT INTO `t_storage` VALUES (1, 1, 100, 0, 100);

 

4.account库新建account表

CREATE TABLE `t_account`  (
  `id` bigint(11) NOT NULL 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 NULL COMMENT '剩余可用额度',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '账户表' ROW_FORMAT = Dynamic;
 
INSERT INTO `t_account` VALUES (1, 1, 1000, 0, 1000);

 

5.上述三个库中必须都有一个回滚日志表

回滚日志表在这里,分别执行三次sql创建

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) 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 AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

6.最终效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值