1、以下演示都需要先启动Nacos后启动Seata,保证两个都OK

2、分布式事务业务说明

1、业务说明

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

当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减单商品的库存,
再通过远程调用账户服务来扣减用户账户里面的余额,
最后再订单服务中修改订单状态为已完成

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

2、下订单—>扣库存—>减账户(余额)

3、创建业务数据库

seata_order: 存储订单的数据库 seata_storage:存储库存的数据库 seata_account: 存储账户信息的数据库

创建库SQL:

  1. CREATE DATABASE seata_order;
  2. CREATE DATABASE seata_storage;
  3. CREATE DATABASE seata_account;

4、按照上述3库分别建对应业务表

  • seata_order库下建t_order表 `` DROP TABLE IF EXISTSt_order; CREATE TABLEt_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;
  1. - 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);

  1. - 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); ```

5、按照上述3库分别建对应的回滚日志表

1、订单-库存-账户3个库下都需要建各自的回滚日志表

2、\seata-server-0.9.0\seata\conf目录下的db_undo_log.sql

3、建表SQL

image.png