分布式事务(两阶段提交、三阶段提交)

article/2025/9/15 7:47:56

假如没有分布式事务

在一系列微服务系统当中,假如不存在分布式事务,会发生什么呢?让我们以互联网中常用的交易业务为例子:

 

 

 

上图中包含了库存和订单两个独立的微服务,每个微服务维护了自己的数据库。在交易系统的业务逻辑中,一个商品在下单之前需要先调用库存服务,进行扣除库存,再调用订单服务,创建订单记录。

正常情况下,两个数据库各自更新成功,两边数据维持着一致性。

 

但是,在非正常情况下,有可能库存的扣减完成了,随后的订单记录却因为某些原因插入失败。这个时候,两边数据就失去了应有的一致性。

什么是分布式事务?

分布式事务用于在分布式系统中保证不同节点之间的数据一致性。分布式事务的实现有很多种,最具有代表性的是由Oracle Tuxedo系统提出的XA分布式事务协议。

XA协议包含两阶段提交(2PC)三阶段提交(3PC)两种实现,这里我们重点介绍两阶段提交的具体过程。

在XA协议中包含着两个角色:事务协调者事务参与者。让我们来看一看他们之间的交互流程:

第一阶段:

在XA分布式事务的第一阶段,作为事务协调者的节点会首先向所有的参与者节点发送Prepare请求。

在接到Prepare请求之后,每一个参与者节点会各自执行与事务有关的数据更新,写入Undo Log和Redo Log。如果参与者执行成功,暂时不提交事务,而是向事务协调节点返回“完成”消息。

当事务协调者接到了所有参与者的返回消息,整个分布式事务将会进入第二阶段。

第二阶段:

 

在XA分布式事务的第二阶段,如果事务协调节点在之前所收到都是正向返回,那么它将会向所有事务参与者发出Commit请求。

接到Commit请求之后,事务参与者节点会各自进行本地的事务提交,并释放锁资源。当本地事务完成提交后,将会向事务协调者返回“完成”消息。

当事务协调者接收到所有事务参与者的“完成”反馈,整个分布式事务完成。

以上所描述的是XA两阶段提交的正向流程,接下来我们看一看失败情况的处理流程:

第一阶段:

 

 

第二阶段:

 

在XA的第一阶段,如果某个事务参与者反馈失败消息,说明该节点的本地事务执行不成功,必须回滚。

于是在第二阶段,事务协调节点向所有的事务参与者发送Abort请求。接收到Abort请求之后,各个事务参与者节点需要在本地进行事务的回滚操作,回滚操作依照Undo Log来进行。

以上就是XA两阶段提交协议的详细过程。

 

 

XA两阶段提交的不足

XA两阶段提交究竟有哪些不足呢?

1.性能问题

XA协议遵循强一致性。在事务执行过程中,各个节点占用着数据库资源,只有当所有节点准备完毕,事务协调者才会通知提交,参与者提交后释放资源。这样的过程有着非常明显的性能问题。

2.协调者单点故障问题

事务协调者是整个XA模型的核心,一旦事务协调者节点挂掉,参与者收不到提交或是回滚通知,参与者会一直处于中间状态无法完成事务。

3.丢失消息导致的不一致问题。

在XA协议的第二个阶段,如果发生局部网络问题,一部分事务参与者收到了提交消息,另一部分事务参与者没收到提交消息,那么就导致了节点之间数据的不一致。

如果避免XA两阶段提交的种种问题呢?有许多其他的分布式事务方案可供选择:

1.XA三阶段提交

XA三阶段提交在两阶段提交的基础上增加了CanCommit阶段,并且引入了超时机制。一旦事物参与者迟迟没有接到协调者的commit请求,会自动进行本地commit。这样有效解决了协调者单点故障的问题。但是性能问题和不一致的问题仍然没有根本解决。

三阶段提交协议

Three Phase分别为CanCommit、PreCommit、DoCommit。

 

三阶段提交针对两阶段提交做了改进:

  • 引入超时机制。在2PC中,只有协调者拥有超时机制,3PC同时在协调者和参与者中都引入超时机制。
  • 在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

2.MQ事务

利用消息中间件来异步完成事务的后一半更新,实现系统的最终一致性。这个方式避免了像XA协议那样的性能问题。

3.TCC事务

TCC事务是Try、Commit、Cancel三种指令的缩写,其逻辑模式类似于XA两阶段提交,但是实现方式是在代码层面来人为实现。


http://chatgpt.dhexx.cn/article/s2RfcGp5.shtml

相关文章

两阶段提交(2 Phase Commit) 在 PostgreSQL 和 RocksDB 中的实现

文章目录 前言用法PostgreSQLRocksDB 实现PostgreSQL 2PCRocksDB 2PCWRITE_COMMITTEDWRITE_PREPARED解决 snapshot-read 问题解决 rollback 问题 WRITE_UNPREPARED 总结 前言 本节中提到的代码实现是基于 PG:REL_15_STABLE 和 Rocksdb: master-fcd816d534 代码介绍的…

分布式事务(2)两阶段提交

分布式事务(1)基本概念 分布式事务(2)两阶段提交 分布式事务(3)TCC 分布式事务(4)可靠消息最终一致性 分布式事务(5)最大努力通知 分布式事务【2】2PC两阶段提交 1.什么是2PC(两阶段提交)2.解决方案2.1 XA方案2.2 Seata方案 3.seata实现2PC事务4.2PC解决…

MYSQL之两阶段提交和组提交(数据一致性)

我们在MySQL 的日志中详细的介绍了undo log、redo log、binlog这三个日志和所用到的一些缓存知识,那么下面我们分析一下更新语句执行过程,它们是怎么变化的呢?下面我们直接给答案吧。假如我们修改一行主键索引(id)为1的…

MySQL的两阶段提交(数据一致性)

MySQL的两阶段提交 两阶段提交过程为什么要写redo log,不写redo log的话,根本就不会出现“两阶段提交”的麻烦事啊?为什么要写两次redo log,写一次不行吗?在两阶段提交的情况下,是怎么实现崩溃恢复的呢&…

分布式事务之两阶段提交

两阶段提交协议 两阶段提交协议把分布式事务分为两个阶段,一个是准备阶段,另一个是提交阶段;准备阶段和提交阶段都是由事务管理器发起的;我们可以将事务管理器称为协调者,将资源管理器称为参与者。 流程 准备阶段&a…

两阶段提交和三阶段提交的理解

两阶段提交和三阶段提交的理解 本文主要通过梳理流程说明2PC的缺点,并总结3PC的优点。 一、2PC流程及致命问题 如图所示,2PC的流程简要: 1.协调者 参与者都是INIT状态,参与者等待消息。 2.协调者进入prepare状态发送vote_requ…

两阶段提交和三阶段提交的区别

1.分布式理论:一致性协议:2PC 1.1 什么是2PC2PC,即两阶段提交协议的简写,是整个事务过程分为两个阶段,准备阶段(Prepare phase)和提交阶段(Commit phase)两个阶段过程: …

分布式两阶段提交和三阶段提交

随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。 为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。本…

MySQL (十四) 两阶段提交

一. 两阶段提交 1.1 利用 binlog 和redolog 做到两阶段提交 从上图中看出:最后提交事务的三个步骤: 写入redo log ,处于prepare状态写binlog修改redo log 状态变为commit 由于redo log 的提交分为prepare 和commit两个阶段,所以我…

mysql之两阶段提交

什么是两阶段提交 当有数据修改时,会先将修改redo log cache和binlog cache然后在刷入到磁盘形成redo log file,当redo log file全都刷入到磁盘时(prepare 状态)和提交成功后才能将binlog cache刷入磁盘,当binlog全部刷…

分布式事务:两阶段提交与三阶段提交

两阶段提交与三阶段提交 分布式事务二阶段提交请求阶段提交阶段举例故障分析柜员侧出现故障或拒绝Proposal第一阶段经理侧出现故障第二阶段经理侧出现故障 二阶段提交存在的问题 三阶段提交canCommit阶段preCommit阶段doCommit阶段特点 参考 分布式事务 满足ACID(原…

正确理解二阶段提交(Two-Phase Commit)

文章目录 明确问题草稿方案原子提交协议希望实现的2个特性正确的二段提交协议(Two-Phase Commit)二阶段提交协议如何满足安全性(Safety)二阶段提交协议如何满足存活性( Liveness) 如何应对超时 超时终止协议 如何应对宕机重启 二阶…

两阶段提交协议(two phase commit protocol,2PC)详解

一、协议概述 两阶段提交协议(two phase commit protocol,2PC)可以保证数据的强一致性,许多分布式关系型数据管理系统采用此协议来完成分布式事务。它是协调所有分布式原子事务参与者,并决定提交或取消(回…

简单谈谈MySQL的两阶段提交

一、简单回顾三种日志 在讲解两阶段提交之前,需要对MySQL中的三种日志即binlog、redo log与undo log有一定的了解。 在这三种日志中,很多同学会把binlog与redo log混淆,下面使用一张表格来简单对比下两者的区别。 当然,如果对bi…

现控笔记(五)稳定性与Lyapunov方法

稳定性与李雅普诺夫方法 线性系统稳定性:只取决于系统的结构和参数,稳定的条件是特征方程的根都具有负实部(在左半根平面),可用劳斯判据、耐奎斯特判据等方法判断、非线性系统的稳定性:与初始条件和外部扰动的大小有关。 稳定性…

Lyapunov稳定性分析复习笔记

前言 本文所提及的稳定性分析是指系统运动状态的稳定性分析,在进行本文标题内容相关的学习之前,我们首先需要回答一个问题,为什么需要进行稳定性分析?其实这个问题是不言而喻的,稳定性问题在当代显得尤为重要&#xf…

Lyapunov-Krasovskii泛函二重积分项求导_原理

Lyapunov-Krasovskii泛函二重积分项求导_原理 回答[引理1][定理1] 2022年下半年,看了很多关于时滞系统和引入时滞的网络化控制系统的论文,对稳定性证明中Lyapunov-Krasovskii泛函中二重积分项求导结果有些疑问,故在知乎上提问寻求帮助&#x…

Lorenz系统最大lyapunov exponent的求解

首先看下Lorenz混沌系统: 赋予初始值,例如: 当然,初始值可以根据需要设定。 看下他的吸引子,很美: 看下他的分叉图:

matlab 基于Lorenz系统 Lyapunov指数的管道超声导波检测

1、内容简介 略 可以交流、咨询、答疑 2、内容说明 为了提高长距离管道超声导波检测中弱导波信号的识别精度,提出了基于 Lorenz 系统 Lyapunov 指数的 管道超声导波检测方法。基于非共振周期信号的参数激励实现 Lorenz 系统的混沌控制,将待测的导波信…

Lyapunov and Stability Theory

一、什么是稳定点 一个控制系统就和一个社会一样,稳定性是首先要解决的重要问题,是其他一切工作的基础。稳定性问题的字面意思很好理解了,那就是系统在受到扰动后,能否能有能力在平衡态继续工作。大家都知道,历史上社…