分布式事务原因:
单体架构的spring事务不能跨机器,不能跨数据源
分布式事务的概念:
一个业务流程,在分布式系统(微服务)中,每个业务模块都是一个分支,保证每个业务分支一起成功,要么一起失败
CAP 理论:
当 分区(P)存在, 要么满足一致性(CP),要么满足 可用性(AP)
BASE 理论:
基本可用
软状态
最终一致
基于cap 理论和 base 理论提出了两个模式:
AP 模式:最终一致性----各个子事务分别执行和提交,中间软状态处理,达到最终一致性
CP 模式:强一致性------各个子事务分别执行后等待,同时提交或回滚,达到强一致
Seata 事务管理的角色:
XA 模式:CP 模式(强一致性)
两阶段提交:
第一阶段:每个子事务只执行sql,不提交,等待所有子事务执行完
第二阶段:每个子事务提交,由TC 判断结果成功或失败
缺点:等待每个子事务sql 执行完(sql 执行有快慢),等待过程就是资源浪费
AT 模式:AP 模式(最终一致性)(默认)
两阶段提交:
第一阶段:每个子事务执行sql 并提交,记录un_do.log 快照表
第二阶段: TC 判断每个子事务提交结果成功或失败,删除或恢复快照表
优点:节省资源的浪费
TCC 模式:AP 模式(最终一致性)
两阶段提交:
第一阶段:try 写预留代码
第二阶段:confirm 提交成功事务编写代码
Cancel 回滚失败事务编写代码
优点:性能更高
SAGA 模式
总结:
你项目中使用的是springcloud ,你怎么解决微服务模块间的事务问题?
我采用的是阿里第三方组件,seata。从官网下载这个组件服务。Seata 需要注册到nacos 上进行使用。
Seata 基于cap 理论和base 理论。有两种模式 ap 模式(最终一致性),cp 模式(强一直性)。
Seata 提供四种模式:XA ,AT,TCC,SAGA
Seata 角色:TC,TM,RM
我采用是AT 模式,它采用两阶段提交,第一阶段执行sql 并提交,第二阶段 TC 判断结果
Yml 配置下模式和加上注解@GloableTransactional就可以了