【Seata】_01 分布式事务基础知识和常见的解决方案

news2024/9/29 23:38:18

本地事务

单一的数据库事务,ACID由数据库直接提供

分布式事务

一个服务调用操作两个数据库;
多个服务操作同一个数据库;
多个服务操作多个数据库;
分布式事务无法由数据库保证

Seata 分布式事务解决方案

Seata提供AT/TCC/SAGA/XA事务模式。AT模式是阿里首推,本文主要基于AT学习
官网
源码

三大角色

TC(Transaction Coordinator):事务协调者
维护全局和分支事务状态,驱动全局事务提交或回滚
TM(Transaction Manager): 事务管理器
定义全局事务的范围,开始全局事务、提交或回滚全局事务
RM(Resource Manager):资源管理器
管理分支事务处理的资源,与TC交谈注册分支事务和报告分支事务状态,并驱动分支事务提交或回滚
其中,TC为单独部署的Server,TM和RM为嵌入到应用中的Client

二阶段提交协议

常见分布式解决方案
1、seata 阿里分布式事务框架
2、消息队列
3、saga
4、XA
他们有一个共同点,都是"两阶段(2PC)。"两阶段"是指完成整个分布式事务,划分成两个步骤完成
实际上,这四种常见的分布式事务解决方案,分别对应着分布式事务的四种模式:AT、TCC、Saga、XA;
四种分布式事务模式,都有各自的理论基础,分别在不同的时间被提出;每种模式都有它的适用场景,同样每个模式也都诞生有各自的代表产品;而这些代表产品,可能就是我们常见的(全局事务、基于可靠消息、最大努力通知、TCC)
我们会分别来看4种模式(AT、TCC、Saga、XA)的分布式事务实现.
在看具体实现之前,先讲下分布式事务的理论基础

分布式事务理论基础

因为3PC实现非常困难。市面上一般都是2PC:两阶段提交协议,

2PC

分为两个阶段:Prepare和Commit

Prepare:提交事务请求

参与者一般是数据库或者应用
1.询问:协调者向所有参与者发送事务请求,询问是否可执行事务操作,然后等待各个参与者的响应.
2.执行:各个参与者接收到协调者事务请求后,执行事务操作(例如更新一个关系型数据库表中的记录),并将Undo和Redo信息记录事务日志中
3.响应:如果参与者成功执行了事务并写入Undo和Redo 信息,则向协调者返回YES 响应,否则返回NO 响应。当然,参与者也可能宕机,从而不会返回响应

Commit:执行事务提交

正常提交

1.commit:请求协调者向所有参与者发送 Commit 请求,
2.事务提交:参与者收到 Commit 请求后,执行事务提交,提交完成后释放事务执行期占用的所有资源
3.反馈结果:参与者执行事务提交后向协调者发送 Ack 响应
4.完成事务:接收到所有参与者的 Ack响应后,完成事务提交

中断事务

Prepare过程中某些参与者执行事务失败、宕机或与协调者之间的网络中断,那么协调者就无法收到所有参与者的 YES响应,或者某个参与者返回了 No响应在执行
此时,协调者就会进入回退流程,对事务进行回退。
1.rollback请求:协调者向所有参与者发送 Rolback 请求
2.事务回滚:参与者收到 Rollback后,使用Prepare 阶段的 Undo 日志执行事务回滚,完成后释放事务执行期占用的所有资源
3.反馈结果:参与者执行事务回滚后向协调者发送Ack响应
4.中断事务:接收到所有参与者的 Ack 响应后,完成事务中断

2PC问题

1.同步阻塞:参与者在等待协调者的指令时,其实是在等待其他参与者的响应,在此过程中,参与者是无法进行其他操作的,也就是阻塞了其运行。倘若参与者与协调者之间网络异常导致参与者一直收不到协调者信息,那么会导致参与者一直阻塞下去
2.单点:在2PC中,一切请求都来自协调者,所以协调者的地位是至关重要的,如果协调者宕机,那么就会使参与者一直阻塞并一直占用事务资源.
如果协调者也是分布式,使用选主方式提供服务,那么在一个协调者挂掉后可以选取另一个协调者继续后续的服务,高可用带来的是新协调者无法知道上一个事务的全部状态信息(比如已等待Prepare响应的时长等),所以也无法顺利处理上一个事务
3.数据不一致:Commit 事务过程中 Commit 请求/Rolback 请求可能因为协调者宕机或协调者与参与者网络问题丢失,那么就导致了部分参与者没有收到 CommitRolback 请求,而其他参与者则正常收到执行了 Commit/Rollback操作,没有收到请求的参与者则继续阻塞。这时,参与者之间的数据就不再一致了。
当参与者执行 Commit/Rollback后会向协调者发送Ack,然而协调者不论是否收到所有的参与者的Ack,该事务也不会再有其他补救措施了,协调者能做的也就是等待超时后像事务发起者返回一个"我不确定该事务是否成功”
4.环境可靠性:依赖协调者 Prepare 请求发出后,等待响应,然而如果有参与者宕机或与协调者之间的网络中断,都会导致协调者无法收到所有参与者的响应,那么在2PC中协调者会等待一定时间然后超时,触发事务中断,在这个过程中协调者和所有参与者都是出于阻塞的,这种机制对网络问题要求太苛刻了。

Seata分布式事务不同模式原理

AT模式(auto transcation)

用户只关注自己的业务SQL,用户的业务SQL作为一阶段,Seata会自动生成事务的二阶段提交和回滚操作
在这里插入图片描述
AT模式如何做到对业务的无侵入:
一阶段:Seata 会拦截"业务SQL",首先解析SQL语义,找到"业务SQL"要更新的业务数据,在业务数据被更新前,将其保存成"before image",然后执行“业务SQL"更新业务数据,在业务数据更新之后,再将其保存成"after image",最后生成行锁(此时这条数据对外不可见)。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性
在这里插入图片描述
二阶段提交:
在这里插入图片描述
二阶段回滚:
Seata 就需要回滚一阶段已经执行的"业务SQL",还原业务数据。回滚方式便是用"before image"还原业务数据;但在还原前要首先要校验脏写,对比"数据库当前业务数据"和"after image",如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理
在这里插入图片描述

TCC

TCC模式需要用户根据自己的业务场景实现 Try、Confimm 和 Cancel 三个操作;事务发起方在一阶段执行 Try 方式,在二阶段提交执行 Confirm 方法,二阶段回滚执行 Cancel 方法。很像事务消息,侵入性比较强,而且要自己实现事务控制逻辑,优点是没加锁,性能更强
在这里插入图片描述

可靠消息最终一致性方案

RocketMq之事务消息实现原理
这个文章没有提到的是如果消费者这边没有成功消费MQ会让他重试,但是还存在一个问题,消费者如果事务失败回滚怎么处理?继续给生产者发送事务消息?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDMI Audio InfoFrame

Audio InfoFrame 是HDMI Source向Sink传递当前音频流特性的一种InfoFrame。要求是至少每两帧图像就要传输一次Audio InfoFrame。Audio InfoFrame的传输可以是Data Island周期的任何时刻。 HDMI在音频的传输上,packet包的标准是按照IEC60958或者IEC61938来的。 Aud…

使用契约测试得不偿失?试试契约先行开发

契约维护的难题 如今微服务凭借其灵活、易开发、易扩展等优势深入人心,不同服务之间的集成和交互日渐繁多且复杂。这些服务之间交互的方式是多样的,常见的有 HTTP 请求和消息队列。在它们交互的过程中,会有服务的版本演进,交互信…

算法的时间复杂度与空间复杂度

…………………………………………………………………………………………………………………… ………………………………………………………………………加油…………………………………………………………………………. 如何衡量一个算法的好与坏呢?这是本篇的重点…

财报解读:硬件支撑思科增长,云平台何时能突围?

北京时间2023年2月16日,美国网络设备老牌巨头思科公布了其2023财年第二季度财报,业绩超预期。 据思科财报显示,其2023财年Q2实现营收136亿美元,分析师预期为134.3亿美元;同时给出大超预期的业绩指引,思科预…

jetson nano(ubuntu)编译Qt creator

文章目录一.apt安装二.源码编译安装1.Qt Creator源码下载2.相关软件安装cmakeninjallvm/clang3.Qt Creator源码编译一.apt安装 sudo apt-get install qtcreatorapt安装的版本只有4的,版本较低,只有qmake进行项目配置,6版本以上可以使用cmake…

7大体系防作弊,牛客放大招了!严肃笔试客户端上线!

如果问起学生对在线笔试的印象,“不公平”和“不服气”占了半壁江山。学生认为很多企业的在线笔试系统并不完善。原因一,不能有效地规避部分学生的作弊行为;原因二,在线考试系统不稳定,bug频出,导致笔试发挥…

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口,报错:certificate has expired 因为在linux centos环境与window环境有所不同,在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…

RadZen运行和部署,生成业务web应用程序

RadZen运行和部署,生成业务web应用程序 快速简单地生成业务web应用程序,可视化地构建和启动web程序,而我们为您创建新代码。 从信息开始 连接到数据库。Radzen推断您的信息并生成一个功能完备的web应用程序。支持MSSQL REST服务。 微调 添加页面或编辑生…

人工智能、机器学习和深度学习有哪些区别?

人工智能在如今越来越火,诸多词汇时刻萦绕在我们耳边:人工智能、机器学习、深度学习等。不少人对这些高频词汇的含义及其背后的关系总是似懂非懂、一知半解。为了帮助大家更好地理解人工智能,这篇文章用最简单的语言解释了这些词汇的含义&…

tomcat-container 源码分析

说明 本文基于 tomcat 8.5.x 编写。author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 tomcat 的 container 容器 tomcat 由 connector 和 container 两部分组成,connector 接收到请求后,先将请求包装为 request,然后…

六、H5新特性

文章目录一、H5的兼容二、H5新增特性2.1 语义化标签2.2 增强表单2.3 音频、视频一、H5的兼容 支持 HTML5的浏览器包括Firefox(火狐浏览器),IE9及其更高版本,Chrome(谷歌浏览器),Safari,Opera等,国内的遨游浏览器,以及…

【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(上)

目录 一、Istio 介绍 1.1 什么是 service mesh 1.2 什么是 Istio 1.2.1 服务注册和发现 1.2.2 服务度量 1.2.3 灰度发布 1.3 Istio 核心特性 1.3.1 断路器 1.3.2 超时 1.3.3 重试 1.3.4 多路由规则 二、架构和原理 2.1 Istio 架构 2.1.1 数据平面由一组以 Sideca…

【Spring】手动实现简易AOP和IOC

前言 XML:通过Dom4j对XML进行解析和验证。 IOC:通过获取要创建对象的Class类型、构造函数后,通过反射来实现。 AOP:通过使用JDK动态代理和Cglib动态代理实现。 一、解析XML 1.1、解析bean标签 /*** 解析bean标签* param xmlBean…

前端面试当中CDN会问啥------CDN详细教程来啦

⼀、CDN 1. CDN的概念 CDN(Content Delivery Network,内容分发⽹络)是指⼀种通过互联⽹互相连接的电脑⽹络系统,利 ⽤最靠近每位⽤户的服务器,更快、更可靠地将⾳乐、图⽚、视频、应⽤程序及其他⽂件发送给⽤户&…

代谢组学资讯,全球爆火的ChatGPT,是如何看待三阴性乳腺癌的?

领导说 今天下午6点前必须发出一篇推文 我表面毫无波澜实则内心风起云涌 那么问题来了 我如何才能在下班前发送推文准时下班呢 我要怎么写才能获得趣粉们的认可呢 全球爆火的ChatGPT,让我的格局一下打开~,它能不能成为我的“得力助手”?…

跳空缺口指标公式,主图显示向上向下跳空缺口

跳空缺口包含两种类型,向上跳空缺口和向下跳空缺口。向上跳空缺口是指当天最低价高于昨天的最高价,K线图出现缺口。向下跳空缺口是指当天最高价低于昨天的最低价,K线图出现缺口。 注意一下,上面的缺口定义与百科上有区别&#xf…

授权验证方式有很多、但AOP最为优雅。

前言 有时候项目中需要对接口进行校验,增加鉴权,确保 API 不被恶意调用。 项目中都是这样 这样,部分需要查询一些信息,下文需要使用 这样的代码很多,重复率太高。看着我蛋疼,对此优化一下。 方案 1 …

剑指offer 7 数组中和为0的三个数

此问题属于nsum问题,题目链接:力扣 要求在数组中找到不重复的三元组,三个数加起来为0,且每个下标只能用一次。而且需要返回所有这样的不重复数组。 1. 排序 双指针 1. 「不重复」的本质是什么?我们保持三重循环的大…

SpringBoot——日志文件

基本概念 日志文件记录了程序的报错信息,执行时间,用户的登录状态,操作时间等等 通过日志,我们可以轻松的找到程序的问题,得到程序的相关信息 springBoot启动时控制台打印的这些,就是程序的日志 创建日志…

Kafka报错:Controller 219 epoch 110 failed to change state for partition

集群里面kafka报错:Controller 219 epoch 110 failed to change state for partition maxwell_atlas-0 from OfflinePartition to OnlinePartitionkafka.common.stateChangeFailedException: Failed to elect leader for partition maxwell_atlas-0 under strategy …