美文网首页
Seata业务数据库准备

Seata业务数据库准备

作者: Shaw_Young | 来源:发表于2020-09-26 18:56 被阅读0次

    分布式事务业务说明

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

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

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

    创建业务数据库

    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;
    

    最终效果

    相关文章

      网友评论

          本文标题:Seata业务数据库准备

          本文链接:https://www.haomeiwen.com/subject/jgqsdktx.html