微服务保护和分布式事务(5)

米饭11个月前行业资讯857

2.3 XA 模式:

Seata 支持四种不同的分布式事务解决方案:


XA

TCC

AT

SAGA

这里我们以XA模式和AT模式来给大家讲解其实现原理。


XA 规范是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范提供了支持。


2.3.1 两阶段提交:

正常情况:

image-20241121200527340

异常情况:

image-20241121200540213

一阶段:


事务协调者通知每个事务参与者执行本地事务。

本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁。

二阶段:


事务协调者基于一阶段的报告来判断下一步操作。

如果一阶段都成功,则通知所有事务参与者,提交事务。

如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务。

2.3.2 Seata 的 XA 模型:

Seata 对原始的 XA 模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

image-20241121201038925

RM一阶段的工作:


注册分支事务到TC。

执行分支业务 sql 但不提交。

报告执行状态到TC。

RM二阶段的工作:


接收TC指令,提交或回滚事务。

2.3.3 优缺点:

XA模式的优点是什么?


事务的强一致性(只要事务不提交或回滚,会一直持有数据库锁),满足 ACID 原则。

常用数据库都支持,实现简单,并且没有代码侵入。

XA模式的缺点是什么?


因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差。

依赖关系型数据库实现事务。

2.3.4 实现步骤:

首先,我们要在配置文件中指定要采用的分布式事务模式。

seata:
  data-source-proxy-mode: XA


其次,我们要利用@GlobalTransactional标记分布式事务的入口方法(调用者):

image-20241121201937507

2.4 AT 模式:

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

2.4.1 Seata 的 AT 模式:

基本流程图:

image-20241121202304380

阶段一RM的工作:


注册分支事务。

记录 undo-log(数据快照)。

执行业务 sql 并提交。

报告事务状态。

阶段二提交时RM的工作:


删除 undo-log 即可。

阶段二回滚时RM的工作:


根据 undo-log 恢复数据到更新前。

2.4.2 AT 与 XA 的区别:

简述AT模式与XA模式最大的区别是什么?


XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。

XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。

XA模式强一致;AT模式最终一致。

可见,AT 模式使用起来更加简单,无业务侵入,性能更好。因此企业 90% 的分布式事务都可以用 AT 模式来解决。


参考文献:


黑马程序员


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ



相关文章

Spring AOP 实战指南:从入门到精通(4)

Spring AOP 实战指南:从入门到精通(4)

3.5 切点表达式:上面的代码中,我们一直在使用切点表达式来描述切点。下面我们来介绍一下切点表达式的语法。切点表达式常见有两种表达方式:execution:根据方法的签名来匹配。@annotation...

云端之上的边缘:解读云计算与边缘计算的战略融合

云端之上的边缘:解读云计算与边缘计算的战略融合

一、引言在当前的信息化和数字化浪潮中,云计算和边缘计算作为两种重要的计算模型,各自在不同的场景中发挥着不可替代的作用。它们不仅在概念、特点、应用场景上有所不同,而且在实际应用中常常相互协作,形成了一种...

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(1)

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(1)

一、初识 MQ1.1 同步调用:我们观察下,下面这个余额支付功能的流程图:如果我们采用的是基于 OpenFeign 的同步调用,也就是说业务执行流程是这样的:支付服务需要先调用用户服务完成余额扣减。然...

【强化学习】Soft Actor-Critic (SAC) 算法

【强化学习】Soft Actor-Critic (SAC) 算法

一、Soft Actor-Critic (SAC) 算法详解        Soft Actor-Critic(SAC) 是一种最先进的强化学习算法,属于 Ac...

运维初入门之认识运维,运维日常的工作都在干什么

运维初入门之认识运维,运维日常的工作都在干什么

运维是指系统运维,是指负责维护、管理和优化计算机系统和网络设备的工作。运维日常的工作主要包括系统监控、故障处理、性能调优、安全防护、备份和恢复、资源规划等多个方面。以下是对运维日常工作进行详细说明的2...

docker composer 安装sentry的运维总结--未完待续

docker composer 安装sentry的运维总结--未完待续

一、sentry安装1、下载最新的github工程地址是https://github.com/getsentry/self-hosted。我们安装的时候最新版本还是Sentry 21.6.1, 截止目...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。