这位大佬讲的已经很详细了,我也是按照他的文章写的Demo,链接:http://t.csdn.cn/L8z1i,侵删!!!
代码链接地址:https://gitee.com/zongbiggun/seata-tcc-demo
nacos的配置和seata的配置:https://blog.csdn.net/axbdfn/article/details/126586333
业务逻辑
- 用户发起购买商品的订单请求,创建订单且订单状态为创建中,无异常则修改状态为已完成,反之删除订单。
- 调用商品模块,减少商品库存。
- 调用用户模块,先锁定用户金额,无异常则扣款,反之回滚。
表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tcc_order
-- ----------------------------
DROP TABLE IF EXISTS `tcc_order`;
CREATE TABLE `tcc_order` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',
`product_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品id',
`count` int(0) NULL DEFAULT NULL COMMENT '数量',
`money` decimal(11, 0) NULL DEFAULT NULL COMMENT '金额',
`status` int(0) NULL DEFAULT NULL COMMENT '订单状态:0:创建中;1:已完结',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tcc_account
-- ----------------------------
DROP TABLE IF EXISTS `tcc_account`;
CREATE TABLE `tcc_account` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',
`user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户id',
`total` decimal(10, 0) NULL DEFAULT NULL COMMENT '总额度',
`used` decimal(10, 0) NULL DEFAULT NULL COMMENT '已用余额',
`residue` decimal(10, 0) NULL DEFAULT 0 COMMENT '剩余可用额度',
`frozen` decimal(10, 0) NULL DEFAULT 0 COMMENT 'TCC事务锁定的金额',
PRIMARY KEY (`id`, `user_id`) USING BTREE,
UNIQUE INDEX `user_id`(`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tcc_product
-- ----------------------------
DROP TABLE IF EXISTS `tcc_product`;
CREATE TABLE `tcc_product` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
`name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',
`price` decimal(10, 0) NULL DEFAULT NULL COMMENT '商品价格',
`count` int(0) NULL DEFAULT NULL COMMENT '剩余数量',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;