Seata业务数据库准备

2020-09-26  本文已影响0人  Shaw_Young

分布式事务业务说明

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

当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减下单商品的库存,再通过远程调用账户服务来扣减用户账户里面的余额,最后在订单服务中修改订单状态为已完成。
该操作跨越三个数据库,有两次远程调用,很明显会有分布式事务问题。

下订单-->扣库存-->减账户(余额)

创建业务数据库

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

CREATE DATABASE seata_order;
CREATE DATABASE seata_storage;
CREATE DATABASE seata_account;

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

seata_order库下建t_order表

CREATE TABLE t_order (
    `id` BIGINT (11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT (11) 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:已完结'
) ENGINE = INNODB AUTO_INCREMENT = 7 DEFAULT CHARSET = utf8;

seata_storage库下建t_storage表

CREATE TABLE t_storage(
    `id` BIGINT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `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 '剩余库存'
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO seata_storage.t_storage (
    `id`,
    `product_id`,
    `total`,
    `used`,
    `residue`
)
VALUES
    ('1', '1', '100', '0', '100');

seata_account库下建t_account表

CREATE TABLE t_account (
    `id` BIGINT (11) NOT NULL AUTO_INCREMENT PRIMARY KEY 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 '0' COMMENT '剩余可用额度'
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8;

INSERT INTO seata_account.t_account (
    `id`,
    `user_id`,
    `total`,
    `used`,
    `residue`
)
VALUES
    ('1', '1', '1000', '0', '1000')

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

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;

最终效果

上一篇下一篇

猜你喜欢

热点阅读