分布式事务解决方案 - Seata

分布式事务解决方案 - Seata
海林小盆友分布式事务解决方案 - Seata
在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。
应该是都成功或者都失败才对
分布式事务解决思路:Seata架构
相互之间不知道对方成没成功,想办法让事务分支之间感知到彼此的事务状态,才能保证状态一致。
Seata架构
- TC - 事务协调者
- TM - 事务管理器
- RM - 资源管理器
Dcoker部署Seata
- 注意:部署之前先看有哪些网桥
1 | docker network ls |
- 然后看自己的mysql容器是不是在这个网桥下:
1 | docker inspect mysql |
我这里查出来的是在hmall下
- 再查以下nacos容器,我这里查出来是不在hmall里的
如果不在就可以把已经存在的加进来:
1 | docker network connect hmall nacos |
最后执行如下命令即可完成seata的容器化部署
1 | docker run --name seata \ |
部署完成后就可以访问:你的虚拟机地址:7099 访问,用户名密码默认为:admin
微服务集成Seata
- 引依赖
1 | <!--统一配置管理--> |
- 在application.yml中配置TC服务地址
1 | seata: |
这些配置呢所有事务的参与者都要去配啊,所以我们抽取到一个nacos中的共享配置
这时候就有同学问了,这么多依赖直接放在common不就行了吗,非也非也
并不是每个微服务都会有分布式事务,所以哪个微服务用到就往哪个引入就行了
Seata解决分布式事务提供了不同的模式
XA模式
原理:当微服务执行sql的时候还没有提交,会先上锁等待,等待TC检查事务状态之后才会解锁提交,
确保大家是同时成功同时失败的,因为有两阶段
- 一阶段的工作
①RM注册分支事务到TC
②RM执行分支业务sql但不提交
③RM报告执行状态到TC
- 二阶段的工作
①TC检测各分支事务执行状态
a. 如果有成功,通知所有RM事务提交事务
b. 如果有失败,通知所有RM事务回滚事务
②RM接收TC指令,提交或回滚事务
优点:确保了ACID的特性,强一致
缺点: 上锁等待(双刃剑),有些业务是串行执行,每个分支都耗时,所以第一个分支久等了很久,就降低了性能。依赖于关系型数据库实现事务,如果有些数据库不支持XA模式,那就很尴尬了。
实现XA模式
- 修改application.yml共享文件(每个参与事务的微服务),开启XA模式
1 | seata: |
- 给发起全局事务的入口方法添加@GloablTransactional注解
AT模式- 最终一致
Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,不过弥补了XA模式中资源锁定周期过长的缺陷。
在进行RM操作前都是和XA模式一致的
阶段一RM的工作:
① 注册分支事务
② 记录undo-log(数据快照)
③ 执行业务sql并提交
④ 报告事务状态
阶段二提交时RM的工作:
① 删除undo-log即可
阶段二回滚时RM的工作:
① 根据undo-log恢复数据到更新前
鱼和熊掌不可兼得
实现AT模式
- 添加需要分布式事务对应微服务的undo-log到微服务对应的数据库中
- 修改application.yml文件,将事务模式修改为AT模式
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果

























