分布式事务:解决方案之2PC理论

2023-11-05

现在我们了解了《分布式事务:三个概念》《分布式事务:两个理论》,以这些为基础。针对不同的分布式场景,业界常见的有四大解决方案:2PC、TCC、可靠消息最终一致性、最大努力通知。今天我们先说说2PC这个解决方案。

1. 什么是2PC

2PC即两阶段提交协议,是将整个事务流程分为两个阶段:准备阶段(Prepare phase)、提交阶段(commit
phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。

整个事务过程由 事务管理器(TM:Transaction Manager)事务参与者(Resource Manager) 组成,事务管理器负责决策整个分布式事务的提交和回滚,事务事务参与者负责自己本地事务的提交和回滚。

两个阶段:

(1)准备阶段:TM给每个RM发送Prepare消息,每个RM在本地执行事务,并写Undo/Redo日志,此时本地事务没有提交。

(2)提交阶段:TM收到每个RM的执行失败或者超时消息时,直接给每个RM发送回滚(Rollback)消息;否则,发送提交(Commit)消息。每个RM根据消息执行提交或者回滚事务,并释放事务处理中使用的锁资源。注意:必须在最后阶段释放锁资源。

2. 解决方案

2.1 XA方案

2PC的传统方案是在数据库层面实现的,如Oracle、MySQL都支持2PC协议,为了统一标准减少行业内不必要的对
接成本,需要制定标准化的处理模型及接口标准,国际开放标准组织Open Group定义了分布式事务处理模型
DTP(Distributed Transaction Processing Reference Model)。

下面新用户注册送积分为例来说明:

在这里插入图片描述

执行流程如下:

(1)应用程序(AP)持有用户库和积分库两个数据源。

(2)应用程序(AP)通过TM通知用户库RM新增用户,同时通知积分库RM为该用户新增积分,RM此时并未提交事务,此时用户和积分资源锁定。

(3)TM收到执行回复,只要有一方失败则分别向其他RM发起回滚事务,回滚完毕,资源锁释放。

(4)TM收到执行回复,全部成功,此时向所有RM发起提交事务,提交完毕,资源锁释放。

2.1.1 DTP模型

DTP模型定义如下角色:

  • AP(Application Program):即应用程序,可以理解为使用DTP分布式事务的程序。
  • RM(Resource Manager):资源管理器,可以理解为事务的参与者,一般情况下是指一个数据库实例,通过资源管理器对该数据库进行控制,资源管理器控制着分支事务。
  • TM(Transaction Manager):事务管理器,负责协调和管理事务,事务管理器控制着全局事务,管理事务生命周期,并协调各个RM。全局事务是指分布式事务处理环境中,需要操作多个数据库共同完成一个工作,这个工作即是一个全局事务。

DTP模型定义TM和RM之间通讯的接口规范叫XA,简单理解为数据库提供的2PC接口协议,因此基于数据库的XA协议来实现2PC又称为XA方案。

以上三个角色之间的交互方式如下:

(1)TM向AP提供 应用程序编程接口,AP通过TM提交及回滚事务。

(2)TM交易中间件通过XA接口来通知RM数据库事务的开始、结束以及提交、回滚等。

2.1.2 总结:

整个2PC的事务流程涉及到三个角色AP、RM、TM。AP指的是使用2PC分布式事务的应用程序;RM指的是资源管理器,它控制着分支事务;TM指的是事务管理器,它控制着整个全局事务。

(1)在准备阶段RM执行实际的业务操作,但不提交事务,资源锁定;

(2)在提交阶段TM会接受RM在准备阶段的执行回复,只要有任一个RM执行失败,TM会通知所有RM执行回滚操作,否则,TM将会通知所有RM提交该事务。提交阶段结束资源锁释放。

因此我们得出XA方案存在以下问题:

(1)需要本地数据库支持XA协议。

(2)资源锁需要等到两个阶段结束才释放,性能较差。

2.2 Seata方案

Seata是由阿里中间件团队发起的开源项目 Fescar,后更名为Seata,它是一个是开源的分布式事务框架。

传统2PC的问题(资源被锁定,直到最后阶段才释放,性能差)在Seata中得到了解决,它通过对本地关系数据库的分支事务的协调来驱动完成全局事务,是工作在应用层的中间件。主要优点是性能较好,且不长时间占用连接资源,它以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题。

Seata把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本身就是一个关系数据库的本地事务,下图是全局事务与分支事务的关系图:

在这里插入图片描述

与传统2PC 的模型类似,Seata定义了3个组件来协议分布式事务的处理过程:

在这里插入图片描述

  • Transaction Coordinator (TC): 事务协调器,它是独立的中间件,需要独立部署运行,它维护全局事务的运行状态,接收TM指令发起全局事务的提交与回滚,负责与RM通信协调各个分支事务的提交或回滚。
  • Transaction Manager ™: 事务管理器,TM需要嵌入应用程序中工作,它负责开启一个全局事务,并最终向TC发起全局提交或全局回滚的指令。
  • Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器TC的指令,驱动分支(本地)事务的提交和回滚。

下面还是以新用户注册送积分为例来说明:

在这里插入图片描述

具体的执行流程如下:

(1)用户服务的 TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID。

(2)用户服务的 RM 向 TC 注册分支事务,该分支事务在用户服务执行新增用户逻辑,并将其纳入 XID 对应全局事务的管辖。

(3)用户服务执行分支事务,向用户表插入一条记录。

(4)逻辑执行到远程调用积分服务时(XID 在微服务调用链路的上下文中传播)。积分服务的RM 向 TC 注册分支事务,该分支事务执行增加积分的逻辑,并将其纳入 XID 对应全局事务的管辖。

(5)积分服务执行分支事务,向积分记录表插入一条记录,执行完毕后,返回用户服务。

(6)用户服务分支事务执行完毕。

(7)TM 向 TC 发起针对 XID 的全局提交或回滚决议。

(8)TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

2.2.1 与传统2PC的差别

(1)架构层次方面,传统2PC方案的 RM 实际上是在数据库层,RM 本质上就是数据库自身,通过 XA 协议实现,而Seata的 RM 是以jar包的形式作为中间件层部署在应用程序这一侧的。

(2)两阶段提交方面,传统2PC无论第二阶段的决议是commit还是rollback,事务性资源的锁都要保持到Phase2完成才释放。而Seata的做法是在Phase1 就将本地事务提交,这样就可以省去Phase2持锁的时间,整体提高效率。

——End——
更多精彩分享,可扫码关注微信公众号哦。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式事务:解决方案之2PC理论 的相关文章

  • seata

    Seata 1 seata概述 1 1 Seata简介 Seata 是一款开源的分布式事务解决方案 xff0c 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 xff0c
  • Seata整合nacos

    author zxw email 502513206 64 qq com 64 Jishou University 1 前言 之前一直使用的是seata 43 eureka的方式来使用 xff0c 最近自己在家的时候忽然想用nacos来试试
  • springcloud通过nacos整合seata遇到的问题

    1 配置完成后 xff0c 启动seata server服务器 xff0c 注册到nacos xff0c 启动client后访问接口 xff0c 报错如下 xff1a io seata common exception FrameworkE
  • Seata

    Seata 微服务分布式事务组件 一 什么是分布式事务 1 什么是事务 事务指的是一个操作单元 xff0c 在这个操作单元中的所有操作最终要保持一致的行为 xff0c 要么所有操作都成功 xff0c 要么所有的操作都被撤销 2 本地事务 本
  • SpringCloud:seata 服务端启动以及介绍(1)

    SpringCloud xff1a seata 服务端启动以及介绍 文章目录 SpringCloud xff1a seata 服务端启动以及介绍关联文章1 seata是什么1 1 四种事务模式1 2 三种角色 2 启动seata 服务端 x
  • 【Seata】安装 - mac

    1 下载 官网 xff1a https seata io zh cn index html 2 修改配置文件 2 1 file conf 还有user password 2 2 registry conf 1 xff09 registry
  • 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题

    大家好 我是曹尼玛 从大学毕业5年 一直努力学习 努力工作 追求新技术 不保守 上个月我来到一家新公司上班 月薪20K 这家公司老板人很好 对员工很关爱 公司氛围不错 同事们也努力把公司项目搞搞好 除了那个混日子的10年开发经验的老王 老板
  • 分布式事务的几种解决方案

    一 基础概念 1 什么是事务 事务可以看做是一次大的活动 它由不同的小活动组成 这些活动 要么全部成功 要么全部失败 2 本地事务 在计算机系统中 更多的是通过 关系型数据库来控制事务 这是利用数据库 本身的事务特性来实现的 因此叫 数据库
  • Seata导致本地事务@Transactional失效解决方案

    原理 把spirng本地事务数据源设置为seata代理数据源 核心代码 在seata配置类中加入 Bean txManager public DataSourceTransactionManager txManager DataSource
  • 阿里开源一站式分布式事务框架seata源码分析(AT模式下TC分析)

    DefaultCoordinator1 seata Server分析 TC源码分析 在seata tc服务的启动的时候都是通过它提供的启动脚本来启动 对于seata Server的入口分析 也是启动脚本就可以看出 如下我截最后执行命令 才下
  • seata1.3.0 系列学习(二、nacos+seata使用)

    上篇文章讲了如何安装seata 这篇文章主要讲如何使用 分布讲解什么情况回滚 不回滚 一 新建父级maven pom xml文件导入
  • 2PC(两阶段提交)方案

    XA方案 2PC的传统方案是在数据库层面实现的 如Oracle MySQL都支持2PC协议 为了统一标准减少行业内不必要的对接成本 需要制定标准化的处理模型及接口标准 国际开放标准组织Open Group定义了分布式事务处理模型DTP Di
  • Transactional outbox pattern

    文章目录 Transactional outbox pattern 事件驱动架构 Event Driven Architecture EDA 数据库事务和消息发布的一致性问题 Transactional outbox如何解决数据事务和消息发
  • SpringCloudAlibaba - Seata (1) 各模式详解、微服务集成、集群搭建

    文章目录 分布式事务模型 Seata 架构 部署 TC 服务 微服务集成 Seata XA 模式 Seata 实现的 XA 模式 XA 模式的具体实践 AT 模式 AT 模式与 XA 模式最大的区别 AT 模式下的脏写问题 AT 模式的具体
  • SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子

    SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子
  • 仅四步教你快速接入Seata分布式事务

    简介 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 为用户打造一站式的分布式解决方案 本篇文章将以视频与文字介绍的形式 指引你
  • 阿里分布式事务框架-seata源码分析

    详细可参考 AT下流程图 TCC下流程图 基于该流程图可大致了解seata中TC TM RM这3个角色在seata框架中的作用 以及两种模式的优缺点
  • 11、Seata AT+SpringCloud+MyBatisPlus+Nacos进行分布式事务操作

    具体请看 http blog shangsw com articles 2020 03 28 1585382453622 html
  • 二阶段无法解决的问题

    二阶段无法解决的问题 协调者再发出commit消息之后宕机 而唯一接收到这条消息的参与者同时也宕机了 那么即使协调者通过选举协议产生了新的协调者 这条事务的状态也是不确定的 没人知道事务是否被已经提交 与两阶段提交不同的是 三阶段提交有两个
  • 事务,不只ACID

    1 什么是事务 应用在运行时可能会发生数据库 硬件的故障 应用与数据库的网络连接断开或多个客户端端并发修改数据导致预期之外的数据覆盖问题 为了提高应用的可靠性和数据的一致性 事务应运而生 从概念上讲 事务是应用程序将多个读写操作组合成一个逻

随机推荐

  • 20200331 --【Python】-- selenium 登录练习

    学习 python 的第59天 模拟腾讯课堂 自动化 登录案例 简单 coding utf 8 Time 2020 3 31 10 52 Author admin Site File 腾讯课堂登录 py Software PyCharm i
  • Allegro显示飞线和隐藏飞线

    隐藏飞线 显示飞线
  • C++ 标准库中数据类型转换

    头文件引用
  • 延迟队列的方案设计

    延迟队列的实现方案 一 应用场景 什么是延时队列 顾名思义 首先它要具有队列的特性 再给它附加一个延迟消费队列消息的功能 也就是说可以指定队列中的消息在哪个时间点被消费 延时队列在项目中的应用场景是比较多的 尤其像电商类平台 1 订单成功后
  • 基于js利用经纬度进行两地的距离计算

    根据地球上两点之间的经纬度计算两点之间的直线距离 经纬度到距离的计算在通信工程中应用比较广泛 所以cosbeta通过搜索找到了一个js的计算脚本 其实是google map的计算脚本 应该算是比较准确了 做成了这个经纬度算距离的工具 今天有
  • 全到哭,阿里新产2023版Java架构核心宝典,涵盖Java进阶所有主流技术

    导言 什么是架构师 对于程序员来说 聊架构是一个永不过时的话题 实际上 每一家公司都有自己对架构师不同的定位 因为不同的公司 所处的阶段 业务模式以及应用场景都不一样 因此对架构师的要求不一样 所以定位也就不同 但是 无论如何 架构师除了优
  • STM32------TFTLCD原理

    目录 TFTLCD简介 一 知识点 1 TFTLCD驱动原理 ALINETEK TFTLCD模块介绍 2 2 8寸TFLCD模块特点 3 TFTLCD模块原理图 4 TFTLCD接口说明 5 并口驱动简介 6 ILI9341驱动时序 7 驱
  • 过滤器使用与bean注入

    1 web xml中各元素启动顺序 在项目启动时 监听器listener最先初始化 然后是过滤器filter 最后是servlet Spring监听器在启动时会读取spring配置文件 进行spring容器的初始化 springMVC的di
  • springBoot上传文件时MultipartFile报null 空 问题解决方法

    1 问题描述 之前用spring MVC 转成spring boot之后发现上传不能用 网上参考说是spring boot已经有CommonsMultipartResolver了 但是我的上传后台接收的还是null 2 第一种解决方法 加入
  • Jenkins中使用火线进行Android静态代码扫描

    背景 火线 是360Qtest测试团队在公司内部经过半年实践后向外推出的一款针对Android代码的静态扫描工具 本文主要介绍如何在Jenkins下植入火线扫描并实时查看结果的配置 环境配置 Jenkins 推荐使用最新的版本 本文使用的是
  • Java基础系列8:Java的序列化与反序列化(修)

    一 简介 对象序列化就是把一个对象变成二进制的数据流的一种方法 通过对象序列化可以方便地实现对象的传输和存储 把对象转换为字节序列的过程称为对象的序列化 把字节序列恢复为对象的过程称为对象的反序列化 对象的序列化主要有两种用途 1 把对象的
  • matlab gui 如何输入矩阵,在matlab中如何输入矩阵方?

    这需要GUI设置 举个例子 By lyqmath DLUT School of Mathematical Sciences BLOG http blog csdn net lyqmathfunction main clc clear all
  • 【华为OD机试真题 JAVA】按身高和体重排队

    JS版 华为OD机试真题 JS 按身高和体重排队 标题 按身高和体重排队 时间限制 1秒 内存限制 262144K 语言限制 不限 某学校举行运动会 学生们按编号 1 2 3 n 进行标识 现需要按照身高由低到高排列 对身高相同的人 按体重
  • python3GUI--模仿一些b站网页端组件By:PyQt5(详细介绍、附下载地址)

    文章目录 一 前言 二 展示 1 banner 1 静图 2 动图 2 一般视频组件 1 静图 2 动图 3 排行榜 1 静图 2 动图 三 设计心得 顺序由简到难 1 排行榜 2 一般视频组件 3 banner 四 总结 五 下载地址 一
  • 介绍一下lpc1114

    我是LPC1114 它是一款由NXP半导体制造的低功耗32位ARM Cortex M0微控制器 具有多种外设 可满足高性能应用的需求 它拥有一个32位ARM Cortex M0内核 可以运行频率高达50MHz 提供最大64KB的Flash存
  • 基于opencv的数字识别系统

    一 目的 想要实现的功能 帮助我们在泵中扫描燃油 并在应用程序中输入燃油信息 所需技术 python程序对于拍摄的汽油泵的图像 尝试从中读取数字 opencv实现 先使用python对其进行原型设计 然后将代码转换成C 以在ios应用程序上
  • idea java编译报错_IDEA编译java报错的解决方法

    IDEA编译java报错的解决方法 发布时间 2020 06 26 11 54 16 来源 亿速云 阅读 119 作者 Leah 本篇文章给大家分享的是有关IDEA编译java报错的解决方法 小编觉得挺实用的 因此分享给大家学习 希望大家阅
  • Android Studio设置

    界面设置 默认的 Android Studio 为灰色界面 可以选择使用炫酷的黑色界面 Settings gt Appearance gt Theme 选择 Darcula 主题即可 字体设置 系统字体设置 如果你的Android Stud
  • js对表单序列化、MD5加密、AES加解密、cookie操作的、websocket等常用工具的整合

    在平时写代码中 一些工具会经常用到 但是我每次要用时都是到处去找依赖文件或者重新写方法 这样很麻烦于是为了方便我将一些常用的工具类写在一个js文件中 之后使用直接引入文件就可以了 这里我也拿出来分享给大家 批注 这个工具类中并不完全是本人原
  • 分布式事务:解决方案之2PC理论

    现在我们了解了 分布式事务 三个概念 和 分布式事务 两个理论 以这些为基础 针对不同的分布式场景 业界常见的有四大解决方案 2PC TCC 可靠消息最终一致性 最大努力通知 今天我们先说说2PC这个解决方案 1 什么是2PC 2PC即两阶