一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。
日常
1、起床6:00
2、健身1.5h
今天练了二头、肩,然后跑了半个小时有氧,明天练背、胸
3、LeetCode刷了2题
- 岛屿数量:DFS 、中
- 使用深度优先遍历DFS 计算矩阵中所有岛屿的数量,先遍历整个矩阵,当元素是岛屿时,且未被遍历过 ,则对该元素进行深度优先遍历 ,并且使得岛屿数量++,每一部分都是一个岛屿,直到所有元素均遍历一遍,此时返回得到的islands
- 深度优先遍历DFS:使用递归的方法进行实现,要设置一个flag矩阵,标志矩阵中的每个元素是否被遍历过(0未遍历1被遍历),遍历矩阵,当遇到满足条件且未被遍历过 的元素时,对其调用深度优先遍历DFS ,在DFS函数中,要对当前元素上下左右四个位置的元素判断是否满足条件且未被遍历过,如果满足,则对该元素进行DFS函数递归
- DFS深度优先遍历是尽可能的深 ,而且要用辅助矩阵标识元素是否遍历过
- 腐烂的橘子:BFS 、中
- 使用广度优先遍历BFS ,求广度优先遍历算法的最大深度 就是所求的天数,而且要考虑两部分元素不在一起 的情况,所有要遍历整个矩阵 ,对每一部分均进行一次BFS并计算其深度 ,最后比较各个部分的深度,返回最大深度即可
- BFS广度优先遍历:要尽可能广 ,仍要使用辅助数组来标识每个元素是否遍历过 ,当元素满足条件且未遍历过时,先修改辅助数组的值,然后判断其上下左右四个位置的元素是否满足条件且未被遍历过,然后不是直接进行递归函数调用 ,而是使用队列QUEUE来保存未遍历过的元素 ,当队列不为空 时,每次取出队首元素先进行遍历,然后对上下左右元素判断是否加入队列
- 可以使用ArrayList + head + rear来模拟QUEUE,此时当head < rear 时就说明队列不空,取出队首元素遍历,head++,然后判断上下左右元素是否入队,rear++
4、复盘23:00
不复盘等于白学!!!!
学习和感想
SpringCloud学习:Seata分布式事务处理
1. 面试题
- 多个数据库之间如何处理分布式事务?如何保障分布式事务一致性?
- 使用全局事务,TC就是Seata微服务,TM就是全局事务,RM就是分支业务
- alibaba的Seate-AT模式如何做到对业务的无侵入?
- 分布式事务的方案有哪些
2. 分布式事务问题如何产生
- 在微服务架构下,微服务的一次调用可能会有一个调用链,对多个微服务执行事务操作,此时就会出现不一致性问题,因为各个数据库的内部数据由本地事务进行一致性处理
- 在微服务架构下要解决多个数据库的分布式事务,独立数据库的一致性通过单机事务实现
- 一次业务操作要多个数据源远程调用,就会产生一致性问题 ,而数据库是基于单机事务 的,不支持分布式事务场景,故要通过其他技术来实现分布式事务
- 各个数据库源是独立的,内部数据一致性由本地事务来保证 ,但是全局的数据一致性无法保证,要使用全局事务
3. Seata简介:分布式事务解决方案
- 是什么:简单(S imple)可扩展(E xtensible)自治(A utonomous)事务(T ransaction)框架(Architecture)
- 能干嘛:分布式事务解决方案 ,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
- 官网:www.seata.io
- 怎么用
- 使用内置的注解:@Transaction和@GlobalTransaction
- 分布式事务交易解决方案
4. Seata工作流程简介
- 分布式事务的管理,就是全局事务XID的传递和变更,分布式事务的管理,就是对全局事务XID的传递和管理
- TM向TC申请一个全局事务XID,然后对其之后调用的所有微服务传入XID,在微服务中使用RM向TC创建分支事务进行数据库操作,若有一个分支事务出现故障,则由TC对整个XID上的事务进行回滚
- 一个分布式事务就是一个全局事务,组织安装和配置多个分支事务(各个数据库的本地事务)
- Seata对分布式事务的协调和控制就是1+3
- 1个XID:全局事务的唯一标识,在服务的调用链路中传递,绑定到事务上下文
- 3个概念:TC->TM->RM
- 三个组件相互协作,TC就是Seata,以Seata服务器(server)形式部署,并有一个控制台7091 ,TM(标注全局事务注解的微服务 ,是整个事务的入口 ,决定事务的范围 ,TM也是RM)和RM(数据库)则是以SeataClient形式集成在微服务中
- TC就是Seata server,是独立部署的一个微服务,TM和RM都是业务微服务中进行配置的,对于整个全局事务的入口,配置为TM,其余微服务配置为RM
- 而且因为Seata是独立部署的,故为实现一致性,必须为Seata微服务创建专属的数据库seata和表(从官网上找),并在seata的config文件进行配置
- 分布式事务的执行流程
- TM先向TC申请一个全局事务XID ,此时由TM决定事务范围 ,调用哪些微服务实现业务,XID会随着请求调用进行传递,传到一个微服务中,RM向TC注册分支事务 ,将其纳入XID对应全局事务的管辖 ,最后由TM向TC发起针对全局事务XID的全局提交或者回滚 ,由TC调度XID的全部分支事务进行提交或回滚
- 各个事务的模式
- Seata AT模式:自动提交模式,此时必须在各个微服务的数据库中创建undo_log回滚表
5. Seata-Server2.0.0安装
- 官网:www.seata.io,去github上下载源码和文件
- 部署指南:Seata分TC、TM、RM 三个角色,TC(server)为单独服务器端部署 ,TM和RM由业务客户端系统集成 ;Seata就是微服务,独立部署,为保证数据一致性,要为seata创建专属的库和表,并在seata/config文件夹内根据环境对Seata进行配置,配置后再启动
- TC就是Seata服务器 ,是独立部署的,TM和RM都是在微服务上进行部署,TM就是全局事务入口,并指定事务的范围,RM就是分支事务,TM、RM均要向TC发出事务申请
- mysql8.0数据库里面建库+建表
- 不推荐MySQL放在Docker里面
- TC就是Seata seaver本身 ,为保证数据稳定 ,必须有专属的数据库(seata)和表,并且要对其config进行配置
- 先创建数据库seata,再在seata库下执行官网的sql脚本来创建必须的表(global_table...)
- 更改配置 :下载的seata文件夹内的配置config
- 根据自己的环境修改seata/config/application.yml中的配置,如store_mode以及注册进入Nacos等
- 启动:因为seata作为单独微服务 ,且配置中要注册进入Nacos ,故先启动Nacos(starp...)再启动Seata ,要先启动Nacos再启动Seata
- 先开启8848Nacos控制台看能不能发现seata微服务,再启动7091控制台进入seata
6. Seate实战-数据库和表准备
- 创建业务数据库
- 创建对应的undo_log回滚日志表 (Seata-AT模式 )
- 要为Seata创建专属的特殊的数据库和表,并修改config配置,然后先启动Nacos再启动Seata,seata作为独立的微服务启动
- Seata-AT是自动回滚模式,为实现这一功能,必须要记录回滚前的值,故要为每个微服务的数据库中创建一个undo_log回滚表,sql代码去官网找
- Seata-AT模式是AutoTransaction 自动回滚模式,故AT模式必须要为每个业务库设置undo_log回滚表
- 当全局事务失败后会回滚,故要记住之前的数据是什么,每个业务库都要创建一个undo_log回滚表 ,具体的sql代码去官网上找
- 创建对应的业务表
7. Seata实战-微服务编码落地实现
- 业务需求
- 以后创建一个订单时,会先判断用户余额和商品库存是否满足,当满足后首先修改用户余额和商品库存,然后生成订单写入数据库,此时会分布式的访问多个数据库,故要使用分布式事务保证数据的一致性![[Pasted image 20241018184638.png]]
- Mybatis一键生成
- 在Mybatis-generator中一键生成entity和mapper
- 修改公共api,创建账户和库存两个微服务的api
- 创建order微服务
- 建项目:约定>配置>编码
- 改POM
- 要注册进入Nacos,要使用Seata分布式事务,要使用Openfeign服务调用,要引入以上的所有依赖
- 写YML
- 要根据环境对微服务的Seata进行配置新版本的seata要使用default_tx_group事务组,与默认的TC服务集群进行映射
- 对微服务所用的Nacos、Openfeign和Seata进行配置
- 主启动
- 要对主启动类添加@SpringbootApplication(设置为springboot启动类)、@MapperScan(扫描所有注解标注的包)、@EnableDiscoveryClient(注册进入Nacos)、@EnableFeignClients(开启openfeign)注解以
- 业务类
- 根据业务需求创建controller调用service接口(要创建serviceImpl实现类),再调用DAO持久层
- 在java下创建mapper文件夹,里面存放各个entity对应的对数据库的操作方法接口,然后在resource文件夹内创建mapper文件夹,并对每个mapper接口设置指定的XXXmapper.xml以对每个接口方法生成对应的SQL语句
- 分布式事务实现
- 当一个方法要调用多个微服务时,且存在多个数据库的操作,则此时必须要使用分布式事务,要在该方法(最起始的方法)上加上@globalTransaction注解标注