《深入理解分布式事务》第五章 强一致性分布式解决方案

文章目录

  • 《深入理解分布式事务》第五章 强一致性分布式解决方案
  • 一、强一致性事务概述
    • 1.典型方案
    • 2.适用场景
    • 3.优缺点
  • 二、DTP 模型
    • 1.DTP 模型的重要概念
    • 2.DTP 模型的执行流程
  • 三、2PC 模型
    • 1.2PC 模型的执行流程
    • 2.事务执行成功的流程
    • 3.事务执行失败的流程
    • 4.2PC 模型存在的问题
  • 四、3PC 模型
    • 1.事务执行成功的流程
    • 2.事务执行失败的流程
    • 3.3PC 模型种存在的问题

一、强一致性事务概述

在分布式事务领域,最早采用的是符合 CAP 理论的强一致性事务来解决分布式事务问题。强一致性分布式事务要求在任意时刻查询参与全局事务的各节点的数据都是一致的

1.典型方案

在强一致性事务解决方案中,典型的方案包括 DTP 模型(全局事务模型)、2PC 模型(二阶段提交模型)和 3PC(三阶段提交模型)3 种

基于 DTP 模型,典型的解决方案是分布式通信协议 XA 规范,MySQL 默认支持 XA 规范。另外 Atomikis 框架和 Dromara 开源社区的 RainCat 框架也在应用层支持 XA 规范,能够实现分布式事务

基于 2PC 模型,典型的解决方案是 Dromara 开源社区开源的 RainCat 框架,在应用层实现了 2PC 模型,避免出现在数据库层实现 2PC 模型时阻塞数据库的情况

由于 3PC 模型的设计过于复杂,在解决 2PC 问题的同时又引入了新的问题,因此在实际工作中的应用不是很广泛

2.适用场景

在分布式事务解决方案中,强一致性事务要求应用程序在任何时间,读取任意节点上的数据,都是最新写入的

强一致性事务主要用于对数据一致性要求比较高,在任意时刻都要查询到最新写入数据的场景,例如跨行转账业务中,张三向李四转账 100 元,则张三账户减少 100 元,李四账户增加 100 元,这两个操作要么都执行成功,要么都执行失败。不存在一个成功,另一个失败的情况

3.优缺点

强一致性事务解决方案存在如下优点:

  1. 数据一致性比较高
  2. 在任意时刻都能够查询到最新写入的数据

强一致性事务解决方案也存在着如下缺点:

  1. 存在性能问题,在分布式事务未完全提交和回滚之前,应用程序不会查询到最新的数据
  2. 实现复杂
  3. 牺牲了可用性
  4. 不适合高并发场景

二、DTP 模型

DTP 模型是 X/Open 组织定义的一套分布式事务标准,这套标准主要定义了实现分布式事务的规范和 API,具体的实现则交给相应的厂商来实现。本节对 DTP 模型的重要概念和执行流程进行简单的介绍

1.DTP 模型的重要概念

DTP 模型种定义了几个重要的概念,分别为事务、全局事务、分支事务和控制线程

  1. 事务:一个事务就是一个完整的工作单元,具备 ACID 特性
  2. 全局事务:由事务管理器管理的事务,能够一次性操作多个资源管理器
  3. 分支事务:由事务管理器管理的全局事务中,每个资源管理器中独立执行的事务
  4. 控制线程:执行全局事务的线程,这个线程用来关联应用程序、事务管理器和资源管理器三者之间的关系,也就是表示全局事务和分支事务的关系,通常称为事务上下文环境

2.DTP 模型的执行流程

DTP 模型定义了实现分布式事务的规范和 API,主要的执行流程如下图所示:

在 DTP 模型中,主要定义了 3 个核心组件,分别为 AP、TM、RM:

  • AP:应用程序(Application Program)可以理解为参与 DTP 分布式事务模型的应用程序
  • RM:资源管理器(Resource Manager)可以理解为数据库管理系统或者消息服务管理器。应用程序可以通过资源管理器和对相应的资源进行有效的控制。相应的资源需要实现 XA 定义的接口
  • TM:事务管理器(Transaction Manager)负责协调和管理 DTP 模型中的事务,为应用程序提供编程接口,同时管理资源管理器

其中,AP 可以和 TM、RM 通信,TM 和 RM 互相之间可以通信,DTP 模型定义了 XA 接口,TM 和 RM 能够通过 XA 接口进行双向通信。TM 控制着全局事务,管理事务的生命周期并协调资源。RM 控制和管理实际的资源

三、2PC 模型

2PC 模型是指两阶段提交协议模型,这种模型将整个事务流程分为 Prepare 阶段和 Commit 阶段。2PC 中的 2 指的是两个阶段,P 是指 Prepare,即准备,C 是指 Commit,即提交

1.2PC 模型的执行流程

Prepare 阶段

在 Prepare 阶段,事务管理器给每个参与全局事务的资源管理器发送 Prepare 消息,资源管理器要么返回失败,要么在本地执行相应的事务,将事务写入本地的 Redo Log 文件和 Undo Log 文件,此时,事务并没有提交

Commit 阶段

如果事务管理器收到了参与全局事务的资源管理器返回的失败消息,则直接给 Prepare 阶段执行成功的资源管理器发送回滚消息,否则,向每个资源管理器发送 Commit 消息。相应的资源管理器根据事务管理器发送过来的消息指令,执行对应的事务回滚或事务提交操作,并且释放事务处理过程中使用的锁资源

2PC 的流程分为事务提交成功和事务提交失败两种情况,下面进行详细介绍

2.事务执行成功的流程

在 2PC 模型中,正常情况下,分布式事务执行成功时,整体上也分为 Prepare 阶段和 Commit 阶段。在 Prepare 阶段事务管理器会向各资源管理器发送 Prepare 消息,在 Commit 阶段事务管理器会向个资源管理器发送 Commit 消息

事务执行成功的流程如下图所示:

由上图可以看出,事务提交成功的情况下,在 2PC 的 Prepare 阶段,由事务管理器向参与全局事务的资源管理器发送 Prepare 消息,资源管理器受到消息后,将事务写入本地的 Redo Log 和 Undo Log 日志,并向事务管理器返回事务执行成功的状态

由下图可以看出,事务执行成功的情况下,在 2PC 的 Commit 阶段,由事务管理器向参与全局事务的资源管理器发送 Commit 消息,资源管理器收到消息后,提交本地事务,并将提交成功的消息返回给事务管理器,同时释放相应的锁资源

3.事务执行失败的流程

在 2PC 模型中,当执行分布式事务失败时,例如在 Prepare 阶段,某些资源管理器向事务管理器响应了 Error 消息,则在 Commit 阶段,事务管理器会向其他响应正常消息的资源管理器发送回滚消息

由上图可以看出,事务执行失败的情况下,在 2PC 的 Prepare 阶段,事务管理器向资源管理器发送 Prepare 消息,某些资源管理器收到消息后,将事务写入本地 Redo Log 和 Undo Log 日志失败,会向事务管理器返回执行失败的消息

由上图可以看出,事务执行失败的情况下,在 2PC 的 Commit 阶段,事务管理器会向在 Prepare 阶段执行事务成功的资源管理器发送 Rollback 消息,对应的资源管理器收到事务管理器发送的 Rollback 消息后,回滚本地的事务,并将回滚成功的消息返回给事务管理器

4.2PC 模型存在的问题

值得注意的是,2PC 模型存在着如下的缺点:

  1. 同步阻塞问题:事务的执行过程中,所有参与事务的节点都会对其占用的公共资源加锁,导致其他访问公共资源的进程或者线程阻塞
  2. 单点故障问题:如果事务管理器发生故障,则资源管理器会一直阻塞
  3. 数据不一致问题:如果在 Commit 阶段,由于网络或者部分资源管理器发生故障,导致部分资源管理器没有接收到事务管理器发送过来的 Commit 消息,会引起数据不一致的问题
  4. 无法解决的问题:如果在 Commit 阶段,事务管理器发出 Commit 消息后宕机,并且唯一接收到这条 Commit 消息的资源管理器也宕机了,则无法确认事务是否已经提交

四、3PC 模型

3PC 模型是指三阶段提交模型,是在 2PC 模型的基础上改进的版本。3PC 模型把 2PC 模型中的 Prepare 阶段一分为二,最终形成 3 个阶段:CanCommit 阶段、PreCommit 阶段和 doCommit 或者 doRollback 阶段

1.事务执行成功的流程

在 3PC 模型中,当事务执行成功时,在 CanCommit 阶段、PreCommit 阶段和 doCommit 阶段,事务管理器与资源管理器之间的消息发送与接收都是正常的,整个分布式事务最终会成功提交

由上图可以看出,在事务执行成功的 CanCommit 阶段,事务管理器向参与全局事务的资源管理器发送 CanCommit 消息,资源管理器收到 CanCommit 消息,认为能够执行事务,会向事务管理器响应 Yes 消息,进入预备状态

由上图可以看出,在事务执行成功的 PreCommit 阶段,事务管理器会向参与全局事务的资源管理器发送 PreCommit 消息,资源管理器收到 PreCommit 消息后,执行事务操作,将 Undo 和 Redo 信息写入事务日志,并向事务管理器响应 Ack 状态,但此时不会提交事务

由上图可以看出,在事务执行成功的 doCommit 阶段,事务管理器会向参与全局事务的资源管理器发送 doCommit 消息,事务管理器接收到 doCommit 消息后,正式提交事务,并释放执行事务期间占用的资源,同时向事务管理器响应事务已提交的状态。事务管理器收到资源管理器相应的事务已提交的状态,完成事务的提交

2.事务执行失败的流程

在 3PC 模型中,某些资源管理器接收到事务管理器发送过来的 CanCommit 消息时,如果资源管理器认为不能执行事务,则会向事务管理器响应无法执行事务的 No 消息。之后事务管理器会在 PreCommit 阶段向资源管理器发送准备回滚的消息,资源管理器向事务管理器响应准备好事务回滚的消息。在 doRollback 阶段,事务管理器会向资源管理器发送回滚事务的消息

由上图可以看出,在事务执行失败的 CanCommit 阶段,事务管理器会向参与全局事务的资源管理器发送 CanCommit 消息,如果资源管理器收到 CanCommit 消息后,认为不能执行事务,则会向事务管理器响应 No 状态

由上图可以看出,在事务执行失败的 PreCommit 阶段,事务管理器会向参与全局事务的资源管理器发送 Abort 消息,资源管理器收到 Abort 消息或者期间出现超时,都会中断事务的执行

由上图可以看出,在事务执行失败的 doRollback 阶段,事务管理器会向参与全局事务的资源管理器发送 Rollback 消息,资源管理器会利用 Undo Log 日志信息回滚事务,并释放执行事务期间占用的资源,向事务管理器返回事务已回滚的状态。事务管理器收到资源管理器返回的事务已回滚的消息,完成事务回滚

3.3PC 模型种存在的问题

与 2PC 模型相比,3PC 模型主要解决了单点故障问题,并减少了事务执行过程中产生的阻塞现象。在 3PC 模型中,如果资源管理器无法及时收到来自事务管理器发出的消息,那么资源管理器就会执行提交事务的操作,而不是一直持有事务的资源并处于阻塞状态,但是这种机制会导致数据不一致的问题

如果由于网络故障等原因,导致资源管理器没有及时收到事务管理器发出的 Abort 消息,则资源管理器会在一段时间后提交事务,这就导致与其他接收到 Abort 消息并执行了事务回滚操作的资源管理器的数据不一致

《深入理解分布式事务》第五章 强一致性分布式解决方案相关推荐

  1. 分布式事务篇——第一章:分布式事务前言

    做开发的同学,在一般的互联网公司会很少接触到分布式,甚至本地事务都不一定经常用,全是靠DB来做支持,或者通过Mybatis,一旦接触到分布式,就一定离不开核心点--分布式事务,本章就来唠唠看大厂这些分 ...

  2. 分布式事务篇——第二章:分布式事务解决之2PC剖析

    前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC. TCC.可靠消息最终一致性.最大努力通知这几种.本文主要着重剖析2PC的方案和落地!! 1.什么是2 ...

  3. 《深入理解分布式事务》第九章 可靠消息最终一致性分布式事务原理

    <深入理解分布式事务>第九章 可靠消息最终一致性分布式事务原理 文章目录 <深入理解分布式事务>第九章 可靠消息最终一致性分布式事务原理 一.基本原理 二.本地消息表 1.实现 ...

  4. 《深入理解分布式事务》第二章 MySQL 事务的实现原理

    shua# <深入理解分布式事务>第二章 MySQL 事务的实现原理 文章目录 一.Redo Log 1.Redo Log 基本概念 2.Redo Log 基本原理 3.Redo Log ...

  5. 《深入理解分布式事务》第一章 事务的基本概念

    <深入理解分布式事务>第一章 事务的基本概念 文章目录 <深入理解分布式事务>第一章 事务的基本概念 一.事务的特性 1.原子性 2.一致性 3.隔离性 4.持久性 二.事务的 ...

  6. 分布式事务的五种解决方案

    分布式事务的五种解决方案 分布式事务 微服务分布式服务问题 什么是分布是事务 分布式事务应用在哪些场景 分布式事务解决方案 1.基于XA协议的两阶段提交(2PC) 2.代码补偿事务(TCC) 3.本地 ...

  7. 《深入理解分布式事务》第八章 TCC 分布式事务原理

    <深入理解分布式事务>第八章 TCC 分布式事务原理 文章目录 <深入理解分布式事务>第八章 TCC 分布式事务原理 一.TCC 核心思想 二.TCC 实现原理 1.TCC 核 ...

  8. 【分布式事务系列九】聊聊分布式事务

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 分布式事务 [分布式事务系列一]提出疑问和研究过程 [分布式事务系列二]Spring事务管理器PlatformTra ...

  9. 分布式事务中常见的三种解决方案

    分布式事务中常见的三种解决方案 目录 一.分布式事务前奏 二.柔性事务解决方案架构 (一).基于可靠消息的最终一致性方案概述 (二).TCC事务补偿型方案 (三).最大努力通知型 三.基于可靠消息的最 ...

最新文章

  1. python开源项目贡献_通过为开源项目做贡献,我如何找到理想的工作
  2. 华为stfal00是什么手机_opporeno5pro和华为p40pro有什么区别 哪款手机更好
  3. Linux修改主机名的两种方法
  4. Android URL
  5. app.vue里使用data_Yeoman自定义Generator使用案例及Plop的使用
  6. oracle管理用户安全,oracle中管理用户的安全
  7. poj1426(dfs)
  8. 仓库管理的5S如何在仓库中实施
  9. mysql1577_使用Navicat for MySQL的1577错误解决办法
  10. mybatis 打印SQL语句
  11. vs2008打开vs2010所做的项目的方法
  12. 模板 | 如何画出漂亮的深度学习模型图
  13. android学习笔记---50_样式与主题,给控件使用样式,给应用使用主题
  14. 《Supervised Descent Method and its Applications to Face Alignment》阅读笔记
  15. 《Cassandra权威指南》第二版书评及访谈
  16. TeaVM辛辛苦苦编译出的wasm,浏览器中不能跑
  17. 全国青少年机器人技术等级考试标准 (三四级/arduino/mixly)
  18. 讯飞、有道、谷歌、微软语音sdk集成总结
  19. Java笔记——Java多线程~
  20. Tkinter 8.5 参考手册: a GUI for Python (五)8(鼠标)指针

热门文章

  1. cv2.error: opencv(4.4.0)_【从零学习OpenCV 4】图像金字塔
  2. python app mysql_Python 操作 MySQL 的5种方式
  3. 快手用计算机说唱的叫什么,HIPHOP人物:“我们呢说唱,会在快手上爆炸!”
  4. (数论)逆元的线性算法
  5. 安装Vim,提示“Could not get lock......”
  6. UIDatePicker的使用
  7. 四种转换方式:自动,强制,Parse,Convert
  8. 《Programming WPF》学习(一)Hello WPF
  9. sql 插入多行数据的问题
  10. 华为路由器http诊断失败_高端家庭的标配,华为路由Q2 Pro是路由器中的吴彦祖...