赞
踩
Seata是分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明、源码分析。
在分布式系统下,一个业务跨越多个服务或数据源,每个服务都是一个分支事务,要保证所有分支事务最终状态一致,这样的事务就是分布式事务。
原子性 | 事务中的所有操作,要么全部成功,要么全部失败 |
---|---|
一致性 | 要保证数据库内部完整性约束、声明性约束 |
隔离性 | 对同一资源操作的事务不能同时发生 |
持久性 | 对数据库做的一切修改将永久保存,不管是否出现故障 |
分布式系统节点通过网络连接,一定会出现分区问题(P);当分区出现时,系统的一致性(C)和可用性(A)就无法同时满足。
分布式系统有三个指标:
1.BASE理论是对CAP的一种解决思路,包含三个思想:
2.分布式事务最大的问题是各个子事务的一致性问题,因此可以借鉴CAP定理和BASE理论:
解决分布式事务,各个子系统之间必须能感知到彼此的事务状态,才能保证状态一致,因此需要一个事务协调者来协调每一个事务的参与者(子系统事务)。
1.解决分布式事务的模型
2.解决分布式事务的思想
1.Seata事务管理中有三个重要的角色:
2.Seata提供了四种不同的分布式事务解决方案:
3.nacos服务名称组成包括?
namespace(命名空间) + group(分组名称) + serviceName(服务名称) + cluster(区域)。
4.seata客户端获取tc的cluster名称方式?
以tx-group-service
的值为key到vgroupMapping
中查找。
XA 规范是 X/Open 组织定义的分布式事务处理(DTP)标准,XA 规范描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范提供了支持。
RM一阶段的工作:
TC二阶段的工作:
RM二阶段的工作:
XA模式的优点:
XA模式的缺点:
Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:
AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。
阶段一RM的工作:
阶段二提交时RM的工作:
阶段二回滚时RM的工作:
AT模式与XA模式最大的区别:
在并发的情况下,事务一执行RM第一阶段
这时DB锁释放,事务二得到DB锁,执行RM第一阶段
后面被事务一获取DB锁,根据快照恢复数据,这时将快照恢复,导致事务二的操作白干了,造成数据安全性问题,隔离性没有得到保障。
全局锁:由TC记录当前正在操作某行数据的事务,该事务持有全局锁,具备执行权。
在并发的情况下,事务一执行RM第一阶段
这时DB锁释放,事务二得到DB锁,执行RM第一阶段
而这时事务一
由于DB锁的等待时间比全局锁久,所以事务一可以等待事务二任务超时,回滚并释放DB锁,但还是有局限,全局锁只能共同作用于seata的事务,不是seata的管理全局事务也可以修改seata的字段。
解决办法
1.1.事务一获取DB锁,保存快照 --> before-imag
1.2.事务一执行业务s --> after-image(执行完后再生成一个快照)
在这种极端的情况下,非seata的管理全局事务修改seata的字段,提交事务,释放DB锁
这时事务一在2.1.获取DB锁,根据快照恢复数据,对比一下此时数据库的字段数据是否被修改过,与 after-image 进行比较即可,再释放全局锁。
2.2.记录异常,发送警告,人工介入
AT模式的优点:
AT模式的缺点:
TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:
一个扣减用户余额的业务。假设账户A原来余额是100,需要余额扣减30元。
TCC的优点:
TCC的缺点:
空回滚:当某分支事务的try阶段阻塞时,可能导致全局事务超时而触发二阶段的cancel操作。在未执行try操作时先执行了cancel操作,这时cancel不能做回滚。
业务悬挂:对于已经空回滚的业务,如果以后继续执行try,就永远不可能confirm或cancel。
应当阻止执行空回滚后的try操作,避免悬挂,执行try操作需要先判断是否发生过回滚,发生过则结束;执行cancel操作也要先判断try操作是否已经执行过。
ps: TCC模式和AT模式类似,yml文件中不需要修改数据源代理的AT模式,只需要编写实现三个方法即可实现TCC模式。
Saga模式是SEATA提供的长事务解决方案。也分为两个阶段:
Saga模式优点
Saga模式缺点
XA | AT | TCC | SAGA | |
---|---|---|---|---|
一致性 | 强一致 | 弱一致 | 弱一致 | 最终一致 |
隔离性 | 完全隔离 | 基于全局锁隔离 | 基于资源预留隔离 | 无隔离 |
代码侵入 | 无 | 无 | 有,要编写三个接口 | 有,要编写状态机和补偿业务 |
性能 | 差 | 好 | 非常好 | 非常好 |
场景 | 对一致性、隔离性有高要求的业务 | 基于关系型数据库的大多数分布式事务场景都可以 | 对性能要求较高的事务。有非关系型数据库要参与的事务。 | 业务流程长、业务流程多参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口 |
->微服务技术栈高级篇--分布式事务--Seata课程视频
高级篇Day2-01-分布式事务理论基础_哔哩哔哩_bilibili
<-
记录每一个学习瞬间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。