微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
分布式事务
38 动手实践
38.5 实现AT 模式
38.5.1 实现 AT 模式
AT模式中的快照生成、回滚等动作都是由框架自动完成,没有任何代码侵入,因此实现非常简单。
- 导入课前资料提供的Sql文件:seata-at.sql,其中lock_table导入到TC服务关联的数据库,undo_log表导入到微服务关联的数据库:
将其导入数据库
现在在数据库中已经有了两个数据库, 一个seata、一个seata-demo
seata 是给TC 事务协调者用的,seata-demo 是给微服务用的
先在seata 中创建lock_table
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table` (
`row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`transaction_id` bigint(20) NULL DEFAULT NULL,
`branch_id` bigint(20) NOT NULL,
`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`gmt_create` datetime NULL DEFAULT NULL,
`gmt_modified` datetime NULL DEFAULT NULL,
PRIMARY KEY (`row_key`) USING BTREE,
INDEX `idx_branch_id`(`branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
OK,这就是全局锁 表
在微服务的seata-demo 数据库中导入数据快照 表 undo_log
OK【数据库准备工作就完成了】
- 修改application.yml文件,将事务模式修改为AT模式即可:
三个微服务都要改yml 配置文件
账户服务:
订单服务:
库存服务:
OK
- 重启服务并测试
三个微服务全部重启【因为笔者这里已经过了一天了】
启动Nacos 服务【单点模式】
访问Nacos 控制台
启动seata-server
OK,现在再来重启三个 微服务
OK,直接开始测试
现在先检查一下数据库中的数据
两条订单数据
账户当前余额 400
库存余额目前为 6
依然使用postman 进行测试
如果设定为 10,很明显就超过了 当前的库存量
直接send
OK, 可以看到500 了
检查数据库中的数据
没有创建 新的订单
账户余额也没有变
库存也没有减少
看看IDEA 的日志
OK
没毛病
现在看看快照表
OK,因为回滚之后,它会把数据都删掉,所以现在啥也看不到,也包括全局锁的信息,用完之后AT 模式都会进行删除
如果想看,可以通过打断点,让它回滚之后不进行删除操作
这样就是AT 模式的实现