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;