1、以下演示都需要先启动Nacos后启动Seata,保证两个都OK
2、分布式事务业务说明
1、业务说明
这里我们会创建三个服务,一个订单服务,一个库存服务,一个账户服务。
当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减单商品的库存,
再通过远程调用账户服务来扣减用户账户里面的余额,
最后再订单服务中修改订单状态为已完成
该操作跨越三个数据库,有两次远程调用,很明显会有分布式事务问题。
2、下订单—>扣库存—>减账户(余额)
3、创建业务数据库
seata_order: 存储订单的数据库 seata_storage:存储库存的数据库 seata_account: 存储账户信息的数据库
创建库SQL:
CREATE DATABASE seata_order;
CREATE DATABASE seata_storage;
CREATE DATABASE seata_account;
4、按照上述3库分别建对应业务表
- seata_order库下建t_order表
`` DROP TABLE IF EXISTS
t_order; CREATE TABLE
t_order(
idbigint(11) NOT NULL AUTO_INCREMENT,
user_idbigint(20) DEFAULT NULL COMMENT '用户id',
product_idbigint(11) DEFAULT NULL COMMENT '产品id',
countint(11) DEFAULT NULL COMMENT '数量',
moneydecimal(11, 0) DEFAULT NULL COMMENT '金额',
statusint(1) DEFAULT NULL COMMENT '订单状态: 0:创建中 1:已完结', PRIMARY KEY (
id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单表’ ROW_FORMAT = Dynamic;
- seata_storage库下建t_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 (id
) 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);
- seata_account库下建t_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);
```