# hbwxz-mall **Repository Path**: gangye/hbwxz-mall ## Basic Information - **Project Name**: hbwxz-mall - **Description**: mall - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 21 - **Created**: 2023-10-29 - **Last Updated**: 2024-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. 订单模块的前提 - seata的学习和使用。 分布式事务:多个微服务操作db的时候,可以进行统一的(原子性) 的事务控制。订单模块:新增订单信息(db save操作)+ 锁定库存(update 操作) 1.1 新增订单信息(db save操作): 订单service 1.2 锁定库存(update 操作):库存service 如果我们锁定库存成功了,但是订单新增失败 -- 都回滚; 如果订单增信成功,锁定库存失败 --- 都回滚 都成则成功 都失败,都失败了。 2. seata的学习 2.1 seata的windows安装(和nacos不太一样,这部分需要涉及到一些命令操作) 2.1.1 nacos (seata 他是控制多个 微服务的 事务;微服务目前的 注册地址 是nacos 如果我们seata想要了解到每个服务,跟每个服务进行通信,那seata也得上nacos) 2.1.2 window的git bash命令,用来运行 seata的配置 -》 上传到 nacos 2.1.3 seata的windows 安装包 + seata的代码文件 https://seata.io/zh-cn/blog/download.html 请下载 1.4.2 版本 -|- seata-server-1.4.2: 我们需要修改file.conf文件和 registry.conf文件 -|- seata-server-1.4.2: 创建db脚本 三个 table。路径:\incubator-seata-1.4.2\script\server\db\Mysql.sql - globalTable = "global_table" 全局的事务开启点。 用订单模块(save) 调用 库存模块(update),此时订单模块 开启 global事务,他属于 global的 branchTable = "branch_table" 库存模块(update)属于整体事务中的一个 分支事务 lockTable = "lock_table" 锁。讲解 seata原理的时候会给大家 涉及到一些 全局锁的相关知识。 -|- 导入 seata的配置到 nacos。 - 从 incubator-seata-1.4.2\script\config-center 寻找到 config.txt文件,并将其复制到 目录: \seata-server-1.4.2\seata\seata-server-1.4.2 中。然后修改 config。txt文件中的 store.mode问db。 并修改jdbcurl和user+password。!!!请格外关注: service.vgroupMapping.my_test_tx_group=default - 从 incubator-seata-1.4.2\script\config-center\nacos 寻找到 nacos-config.sh 复制到 \seata-server-1.4.2\seata\seata-server-1.4.2\conf - 到我们的\seata-server-1.4.2\seata\seata-server-1.4.2\conf下边,使用git bash 运行如下脚本“ sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 7bf2bb8a-8800-4c04-aa44-79c407f9d04e -u nacos -w nacos 至此,seata 安装完毕。 2.2 seata的集成 **测试**(目前的商城项目) 测试链条: admin-service 主要事务; product-service分支事务 2.2.1 pom 文件引入 2.2.2 seata的配置文件(重点) 2.2.3 seata 默认的事务at模式下,需要给每个业务的代码库 新增 undo_log表 ==== 截止到目前,我们发现,seata的日志log一切正常,但是db里边数据还是存储进去了,说明seata的配置是正确的; db没有rollback,说明db的rollback有问题。代码和db的链接上没问题,那么就是datasource的问题。 当前的代码使用的 datasource和seata的datasource不兼容。 ==== seata 需要自己的代理数据源。启动类添加:@EnableAutoDataSourceProxy 2.3 seata的原理讲解(应付面试:AT;对seata更加深入的了解。) 2.3.1 核心三大组件以及三大组件在工作流程中的角色 - TC: 事务协调器,所有的 db 相关的事务操作分支都会和 TC 进行沟通。维护全局事务的运行状态, 协调并且 驱动(发起通知) 全局事务的回滚或者提交。 - TM: 事务管理器。负责开启全局事务(@GlobalTransactional),这个TM只存在于请求第一次发起的 微服务。最终发起全局提交或者全局回顾的决定。 - RM: 负责控制分支事务的,将事务的运行状态汇报给 TC. 并且接受TC的指令,来确认是否回滚。它和DB 的距离是最近的。 RM是和DB之间沟通干活儿的,把干活儿的结果反馈给 TC, TC收集所有结果,来判断(只要有一个失败就回滚) 是否需要回滚,而TC 并没有回滚事务的直接权利,他需要将本消息汇报给TM,由TM最终进行回滚或者提交。 2.3.2 seata的事务模式(4种:AT模式,TCC模式,SAGA模式,XA模式) 2.3.3 AT 模式精讲 2.3.4 四种事务模式的比较总结 3. 订单模块