SpringCloud学习:Seata总结与回顾
文章目录
- SpringCloud学习:Seata总结与回顾
- 1. Seata实战:测试
- 2. Seate原理总结和面试题
- 3. Seata总结与回顾
- 4. 易混点
1. Seata实战:测试
- 测试
- 问题
- 未启用分布式事务
- 若不使用分布式事务,对于调用多个数据库操作的业务无法保证数据一致性,因为当某个数据库事务出错时,其余数据库操作不会回滚
- 当没有使用@globalTranscation注解时,此时获得XID是获取不到的,返回NULL
- 当环境配置成功后,此时测试不会出现问题,但是没有用到分布式事务,只要有一个事务出错则仍不会实现全局事务的回滚,没有实现分布式事务
- 此时因为版本问题在库存时出错,库存和账户的数据库都没变,但是订单却插入进去了,说明分布式事务没有实现,否则整个事务均不会执行
- 启用分布式事务
- 此时order订单也不会插入进行,整个全局事务都会进行回滚
- undo_log回滚表中存放的是当前全局事务所保留的信息,当出错时会根据其进行回滚然后删除信息,不出错时也会对数据进行删除
- 启用之后就可以在seata控制台看到全局事务,以及为每个事务分配的锁,此时当该全局事务下的某个事务出现错误就会对全局事务进行自动回滚(要为每个微服务的数据库创建一个undo_log回滚表)
- 使用 @GlobalTranscational注解对分布式事务的方法进行标注,然后从Seata上下文获得当前全局事务的XID,会自动传递给要实现分支事务的业务
- seata会对每个全局事务分配一个全局锁GlobalLock,此时别的微服务就无法对该全局事务中的资源进行访问
- TC就是Seata server,TM是全局事务的入口,也是一个RM,RM是分支事务,来调用数据库
- seata只会对事务加锁,但不会对数据加锁,故此时别的线程可以对数据进行修改
- 分布式事务 != 分布式锁
- 要注意不是调用太多的分支事务,否则会出现问题
- 未启用分布式事务
2. Seate原理总结和面试题
- Seata原理
- 通过TC(seata微服务)和TM\RM来实现分布式事务,首先要开启seata服务器,然后由TM(全局事务入口)创建全局事务并决定事务的范围,然后每个微服务分支事务由RM向TC创建,共用同一个全局事务的XID,在执行过程中,只要有一个RM出现回滚,则会对整个全局事务中所包含的所有RM进行回滚,且Seata-AT自动回滚模式通过对每个微服务的数据库设置一张undo_log回滚表来实现,该表中存放事务开启前的数据,结束后会对其数据进行删除
- TM也是RM,也要开启一个分支事务,有自己的分支事务ID,但作为TM的RM还要向TC申请一个全局事务的XID
- AT模式如何做到对业务的无侵入
- seata是什么
- undo_log回滚表就是回滚日志,进行反向督查,当某个本地事务出现错误时,会对所有的事务根据各个数据库中的undo_log回滚表进行数据回滚
- 一阶段加载(保存执行前后数据快照): 在undo_log回滚表中保存的是一阶段的内容,有执行业务SQL之前要保存原快照,执行之后要保存新快照
- 二阶段分2种情况:正常提交(只需要将保存的快照删掉即可,因为一阶段已经保存了)和异常回滚(此时要将数据回滚后再删除快照,要对比前后快照判断有没有脏写)
3. Seata总结与回顾
-
微服务架构
-
上传GIT
- 一个项目一般只上传源码、SQL和配置
- .gitignore是指不会上传到git的配置
- 步骤
- 整个工程设置为Git项目:VCS -> Create Git Repository
- 在IDEA中对项目点击顶栏的VCS(版本控制),然后Create Git Repository
- Add:右键工程Git->Add
- Commit:右键工程Git->Commit
- Share Project On Github:顶栏Git->Share Project On Github
- Push:将项目推送到Git中,默认是private,其他人不可见
- 如果需要对外共享,private调整为public,Github网站上工程直接设置
- 整个工程设置为Git项目:VCS -> Create Git Repository
4. 易混点
- Nacos中微服务名是DataId格式,Sentinel是懒加载,只有对某个微服务调用请求后才会在Sentinel加载出资源
- Sentinel的流控是控制对某个请求的最大访问量,而熔断是根据慢调用比例或者异常比例来使得对该微服务的请求全部熔断
- 服务注册和配置中心:Nacos是独立部署的,要先运行Nacos微服务后才可注册进入Nacos,任何要注册进入Nacos的微服务都要设置Nacos的配置
- 服务熔断:Sentinel分为服务器和控制台两部分,是对服务的某个接口进行监控,故要配置在服务提供者微服务上,通过配置来监控访问该微服务某个方法的所有请求
- 服务调用:Openfeign是服务调用组件,可以将服务提供者的所有方法抽取到公共的api接口中,并在该接口中进行@FeignClient配置,而服务提供者不需要进行配置,且服务调用者要通过Openfeign调用对应的方法,故服务调用者也要进行Openfeign配置,且要在主启动上使用@EnableFeignClients注解以标识可以直接使用对应的接口