SpringCloud入门实战(十五)分布式事务框架Seata简介

📝 学技术、更要掌握学习的方法,一起学习,让进步发生
👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。
💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。
💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。
❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。

文章目录

  • 一、分布式事务
    • 1、我们先回顾下事务
    • 2、分布式事务问题
    • 3、一般事务的解决方案为什么不能作用于分布式事务?
  • 二、分布式事务解决方案
  • 三、分布式事务框架Seata
    • 1、Seata是什么
    • 2、Seata整体架构
    • 3、Seata支持的配置中心
    • 4、事务信息存储配置
    • 5、微服务集成seata

我们先来回顾下事务和分布式事务是什么?然后我们面临哪些分布式事务问题,如何解决?带着问题我们一起向下学习。

一、分布式事务

1、我们先回顾下事务

事务是指数据库中的一组操作,这些操作要么全部成功执行,要么全部回滚,以保持数据的一致性和完整性。事务具有以下四个特性,通常称为ACID特性:

  • 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,没有中间状态。
  • 一致性(Consistency):事务的执行使数据库从一个一致性状态转移到另一个一致性状态。事务在开始和结束时,数据库必须满足预定义的一致性规则。
  • 隔离性(Isolation):事务的执行应该与其他并发执行的事务相互隔离,每个事务都感觉不到其他事务的存在。
  • 持久性(Durability):一旦事务提交,其对数据库的修改应该是永久性的,即使在系统故障的情况下也不应丢失。

本地事务:Spring本地事务使用@Transactional 大多数场景下,我们的应用都只需要操作单一的数据库,这种情况下的事务被称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。

分布式事务(Distributed Transaction)是指跨越多个分布式系统的事务,其中涉及到多个独立的参与者和资源。分布式事务需要确保多个参与者之间的操作的一致性和原子性。

2、分布式事务问题

如图,用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:

  • 仓储服务(Stock):对给定的商品扣除仓储数量。
  • 订单服务(Order):根据采购需求创建订单。
  • 账户服务(Account):从用户账户中扣除余额。

单体应用被拆分成微服务应用,原来的三个模块被拆分为三个独立的应用,分别使用三个独立的数据源。
业务操作需要调用三个服务来完成,此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。
故一次业务操作需要跨多个数据源或者需要跨多个系统进行远程调用,就会产生分布式事务问题
在这里插入图片描述

由于网络延迟、节点故障、通信失败等原因,导致分布式事务无法像单个系统的事务那样简单地实现ACID特性。

常见的分布式事务问题包括

  • 部分失败:在一个分布式事务中,有些参与者执行成功,而其他参与者执行失败,导致事务的部分操作成功,部分操作失败。
  • 数据不一致:在一个分布式事务中,数据的一致性无法保证,可能因为参与者之间的数据冲突或者数据同步延迟。

3、一般事务的解决方案为什么不能作用于分布式事务?

解决一般事务问题的方法,例如使用数据库的ACID特性、锁机制、回滚和恢复机制等,无法直接应用于分布式事务问题,原因如下:

  • 并发控制问题:在分布式环境中,由于多个事务同时执行,并发控制变得更加复杂。传统的锁机制在分布式环境中无法有效地协调多个参与者之间的并发访问。
  • 通信故障:分布式事务中的参与者之间通过网络进行通信,网络延迟、断开连接或消息丢失可能导致事务协调失败或超时。
  • 参与者故障:在分布式系统中,参与者可能由于硬件故障、软件错误或其他原因而崩溃或无响应。这可能导致事务无法完成或导致数据不一致。
  • 同步问题:在分布式环境中,数据的复制和同步可能存在延迟,导致不同参与者之间的数据不一致。
  • 跨越多个系统:分布式事务涉及跨越多个独立的系统,每个系统可能具有不同的事务管理机制和数据存储方式,这增加了事务管理的复杂性。

二、分布式事务解决方案

这里先简单提及一下常见的分布式事务解决方案

  • seata阿里分布式事务框架
  • 消息队列
  • saga
  • XA

这四种常见的分布式事务解决方案,分别对应着分布式事务的四种模式:AT、TCC、Saga、XA;

四种分布式事务模式,都有各自的理论基础,分别在不同的时间被提出;每种模式都有他的适用场景,同样每个模式也都诞生有各自的代表产品,而这些代表产品,可能就是我们常见的(全局事务、基于可靠消息、最大努力通知、TCC)

分布式事务相关的协议有2PC、3PC。由于三阶段提交协议3PC非常难实现,目前市面主流的分布式事务解决方案都是2PC协议。两阶段提交协议顾名思义,分为两个阶段:Prepare和Commit。

TCC(Try-Confirm-Cancel)实际上是服务化的两阶段提交协议。

三、分布式事务框架Seata

1、Seata是什么

【Seata官网】

Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 ATTCCSAGAXA四种事务模式,为用户打造一站式的分布式解决方案,包括事务管理、本地事务协调、分布式事务日志和分布式锁等组件。

Seata通过使用分布式事务日志和分布式锁来保证事务的一致性和可靠性。分布式事务日志记录全局事务的操作日志,并提供了事务的恢复和回滚能力。分布式锁用于保护全局事务在不同参与者之间的并发访问,确保数据的一致性和正确性。

2、Seata整体架构

一个典型的分布式事务过程分为一ID(全局事务id)+三组件模型。

  • TC (Transaction Coordinator) - 事务协调者
    维护全局和分支事务的状态,驱动全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器
    定义全局事务的范围:开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器
    管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

在这里插入图片描述
Seata的整体架构如上图,分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,负责维护分布式事务的运行状态,TM和RM(Client端)由业务系统集成,TM是一个分布式事务的发起者和终结者,而RM则负责本地事务的运行并上报。

一个典型的事务过程

1、TM向TC申请开启一个全局事务 ,全局事务创建成功并生成一个全局唯一的XID;

2、XID在微服务调用链路的上下文中传播;

3、RM向TC注册分支事务,将其纳入XID对应全局事务的管辖;

4、TM向TC发起针对XID的全局提交或回滚决议;

5、TC调度XID下管辖的全部分支事务完成提交或回滚请求;

3、Seata支持的配置中心

Seata是一个分布式事务,seata服务端也是一个微服务,需要和其他微服务一样需要注册中心和配置中心

Seata支持的配置中心Seata支持的注册中心
nacos
consul
apollo
etcd
zookeeper
file (读本地文件, 包含conf、properties、yml配置文件的支持)
eureka
consul
nacos
etcd
zookeeper
sofa
redis
file (直连)

4、事务信息存储配置

Server 端存储模式(store.mode)支持三种方式:

存储模式初始化说明
file 单机模式(默认为此模式)无需改动,直接启动全局事务会话信息存储在内存中,读写并持久化至本地文件 root.data (bin\sessionStore\root.data) 中,性能较高
db 高可用模式(Mysql 5.7+)1. 初始DB:seata/script/server/db/mysql.sql
2. 修改存储模式:store.mode=“db”
3. 修改存储数据源:store.db相关属性
全局事务会话信息通过db共享,相应性能差些
redis (Seata-Server 1.3及以上版本支持)1. 修改存储模式:store.mode=“redis”
2. 修改存储数据源:store.redis相关属性
性能较高,存在事务信息丢失风险,需提前配置合适当前场景的redis持久化配置

5、微服务集成seata

Seata安装与环境搭建参看:Seata1.5.2+Nacos分布式事务环境搭建

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境下SVN服务器的搭建与公网访问:使用cpolar端口映射的实现方法

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

Unity——工程与资源

本文将详细介绍Unity工程的文件夹结构,以及动态加载资源的技术要点 一、Unity项目的文件夹结构 1.工程文件夹 在新建工程时,Unity会创建所有必要的文件夹。第一级文件夹有Assets,Library,Logs,Packages,ProjectSettings。 Assets:最主要的文…

C++之map,set,multimap,multiset的使用

map,set,multimap,multiset的使用 关联式容器键值对树形结构的关联式容器setset介绍set的使用set定义方式set各种操作函数 multiset mapmap的介绍map的使用insert函数find函数erase函数[ ]运算符重载map的迭代器遍历 multimap 关联式容器 在…

VC++使用Microsoft Speech SDK进行文字TTS朗读

Microsoft Speech SDK下载地址 https://www.microsoft.com/en-us/download/details.aspx?id10121 需要msttss22L.exe、SpeechSDK51.exe、SpeechSDK51LangPack.exe三个,下载后全部安装 使用VS2005建立一个win32控制台项目 朗读"hello word"、中文“你好”…

弯道超车必做好题集锦三(C语言编程题)

目录 前言: 1.单词倒排 方法1:scanf匹配特定字符法 方法2: 双指针法 2.统计每个月兔子的总数 方法1:斐波那契数列 方法2:斐波那契的递归 3.珠玑妙算 方法:遍历 4.寻找奇数(单身狗&#…

Linux - Docker 安装使用 常用命令 教程

Docker 官方文档地址: Get Started | Docker 中文参考手册: https://docker_practice.gitee.io/zh-cn/ 1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are and where you are on your contain…

VMware 安装 Centos7 超详细过程

CentOS系统,安装教程可参考以下: 哪些模型需要在Linux下运行,需提前预装Linux系统呢,评论区讨论吧 比如Noah-MP 5.0模型 1.软硬件准备 软件:推荐使用 VMware,我用的是 VMware 12 镜像:CentO…

15. 查看开源项目

15.1 parser.add_argument ① 像运行Tensorboar一样,在Terminal终端,可以命令运行.py文件。 ② 如下图所示,Terminal终端运行.py文件时,--变量 后面的值是给变量进行赋值,赋值后再在.py文件中运行。例如 ./datasets/…

【炼气境】HashMap原理以及如何使用

系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么?4、你知道 hash 的实现吗?为什么要这样实现?5、为什么要用异或运算符?6、HashMap 的 table 的容量如何确定?l…

WPF实战项目十三(API篇):备忘录功能api接口、优化待办事项api接口

1、新建MenoDto.cs /// <summary>/// 备忘录传输实体/// </summary>public class MemoDto : BaseDto{private string title;/// <summary>/// 标题/// </summary>public string Title{get { return title; }set { title value; OnPropertyChanged();…

3.(Python数模)整数规划问题

Python解决整数规划问题 在实际生活中&#xff0c;线性规划中的变量不可能都是连续的值&#xff0c;比如不可能计算出0.5个人&#xff0c;0.5只牛羊&#xff0c;往往需要根据题目需要或者实际问题来调整决策变量的变量类型 Continuous’ 表示连续变量&#xff08;默认值&…

Java的23种设计模式

Java的23种设计模式 一、创建型设计模式1.单例模式 singleton1.1.静态属性单例模式1.2 静态属性变种1.3 基础的懒汉模式1.4 线程安全的懒加载单例1.5 线程安全的懒加载 单例-改进1.6 双重检查锁1.7 静态内部类1.8 枚举单例1.9 注册表单例 2.工厂方法模式 factory3.抽象工厂模式…

工具分享 | PDF文档解析工具PyMuPDF

1 需求描述 最近工作需要从PDF文档中按照章节解析出对应的文本和图片(后续可能还会有表格)&#xff0c;经过调研&#xff0c;找到了一个功能强大的解析工具MuPDF&#xff0c;对应的Python包是PyMuPDF。本篇博客记录使用它来实现具体功能。 官方文档&#xff1a;https://pymupd…

Git企业开发控制理论和实操-从入门到深入(四)|Git的远程操作|Gitee

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

ubuntu入门01——windows上直接部署linux(WSL)

win10安装参考如下教程&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 说明&#xff1a;该文档是我按如上教程安装使用Ubuntu写的回顾&#xff0c;家人们参考官方教程更妙。 1.启用适用于Linux的wundows子系统 2.启用虚拟机功能 dism.exe /online /enable-feat…

开源电子合同签署平台小程序源码 在线签署电子合同小程序源码 合同在线签署源码

聚合市场上各类电子合同解决方案商&#xff0c;你无需一个一个的对接电子合同厂商&#xff0c;费时&#xff0c;费力&#xff0c;因为这个工作我们已经做了适配&#xff0c;你只需要一个接口就能使用我们的所有服务商&#xff0c;同时你还可以享受我们的接口渠道价格。 Mini-C…

LeetCode 23 合并 K 个升序链表

LeetCode 23 合并 K 个升序链表 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/merge-k-sorted-lists/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给你一个链表数组…

A 股个股资金流 API 数据接口

A 股个股资金流 API 数据接口 全量股票资金流数据&#xff0c;全量A股数据&#xff0c;最长30日历史数据 1. 产品功能 支持所有A股资金流数据查询&#xff1b;每日定时更新数据&#xff1b;支持多达 30 日历史数据查询&#xff1b;超高的查询效率&#xff0c;数据秒级返回&am…

【LeetCode75】第四十一题 二叉搜索树中的搜索

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个搜索二叉树&#xff0c;让我们找出节点值等于目标的节点并返回出去。 首先我们可以直接遍历整棵二叉树&#xff0c;找到值…

基于大语言模型知识问答应用落地实践 – 知识库构建(下)

上篇介绍了构建知识库的大体流程和一些优化经验细节&#xff0c;但并没有结合一个具体的场景给出更细节的实战经验以及相关的一些 benchmark 等&#xff0c;所以本文将会切入到一个具体场景进行讨论。 目标场景&#xff1a;对于 PubMed 医疗学术数据中的 1w 篇文章进行知识库构…