首页 > 其他分享 >分布式事务两阶段提交和三阶段提交有什么区别?

分布式事务两阶段提交和三阶段提交有什么区别?

时间:2023-07-27 09:35:15浏览次数:47  
标签:事务 协调者 阶段 提交 参与者 分布式

在分布式事务中,通常使用两阶段协议或三阶段协议来保障分布式事务的正常运行,它也是 X/Open 公司定义的一套分布式事务标准。

X/Open 公司是由多家国际计算机厂商所组成的联盟组织,它建立之初是为了向 UNIX 环境提供标准。

分布式事务是指在分布式系统中,多个节点之间进行的事务操作。比如在分布式系统中,用户在下单时,需要同时创建订单信息和减库存的操作,然而创建订单信息和减库存是分布在不同服务器和不同数据库中的,如下图所示:
image.png
此时我们就需要一个分布式事务介入,保证所有操作,要么一起提交,要么一起回滚。

1.两阶段提交

两阶段提交(Two-Phase Commit,简称 2PC)是一种分布式事务协议,确保所有参与者在提交或回滚事务时都处于一致的状态。2PC 协议包含以下两个阶段:

  1. 准备阶段(prepare phase):在这个阶段,事务协调者(Transaction Coordinator)向所有参与者(Transaction Participant)发出准备请求,询问它们是否准备好提交事务。参与者执行所有必要的操作,并回复协调者是否准备好提交事务。如果所有参与者都回复准备好提交事务,协调者将进入下一个阶段。如果任何参与者不能准备好提交事务,协调者将通知所有参与者回滚事务。
  2. 提交阶段(commit phase):在这个阶段,如果所有参与者都已准备好提交事务,则协调者向所有参与者发送提交请求。参与者执行所有必要的操作,并将其结果记录在持久性存储中。一旦所有参与者都已提交事务,协调者将向它们发送确认请求。如果任何参与者未能提交事务,则协调者将通知所有参与者回滚事务。

2PC 协议可以确保分布式事务的原子性和一致性,但是其效率较低,可能会出现阻塞等问题。因此,在实际应用中,可以使用其他分布式事务协议,如 3PC(Three-Phase Commit)或 Paxos 协议来代替。

两阶段提交问题

两阶段提交存在以下几个问题:

  1. 同步阻塞问题:执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。也就是说从投票阶段到提交阶段完成这段时间,资源是被锁住的。
  2. 单点故障:由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。
  3. 数据不一致问题:在 2PC 最后提交阶段中,当协调者向参与者发送 commit 请求之后,发生了局部网络异常或者在发送 commit 请求过程中协调者发生了故障,这会导致只有一部分参与者接受到了 commit 请求。而在这部分参与者接到 commit 请求之后就会执行 commit 操作。但是其他部分未接到 commit 请求的机器则无法执行事务提交,于是整个分布式系统便出现了数据不一致性的现象。

2.三阶段提交

三阶段提交(Three-Phase Commit,简称3PC)是在 2PC 协议的基础上添加了一个额外的阶段来解决 2PC 协议可能出现的阻塞问题。
3PC 协议包含三个阶段:

  1. CanCommit 阶段(询问阶段):在这个阶段,事务协调者(Transaction Coordinator)向所有参与者(Transaction Participant)发出 CanCommit 请求,询问它们是否准备好提交事务。参与者执行所有必要的操作,并回复协调者它们是否可以提交事务。
  2. PreCommit 阶段(准备阶段):如果所有参与者都回复可以提交事务,则协调者将向所有参与者发送PreCommit 请求,通知它们准备提交事务。参与者执行所有必要的操作,并回复协调者它们是否已经准备好提交事务。
  3. DoCommit 阶段(提交阶段):如果所有参与者都已经准备好提交事务,则协调者将向所有参与者发送DoCommit 请求,通知它们提交事务。参与者执行所有必要的操作,并将其结果记录在持久性存储中。一旦所有参与者都已提交事务,协调者将向它们发送确认请求。如果任何参与者未能提交事务,则协调者将通知所有参与者回滚事务。

与 2PC 协议相比,3PC 协议将 CanCommit 阶段(询问阶段)添加到协议中,使参与者能够在 CanCommit 阶段发现并解决可能导致阻塞的问题。这样,3PC 协议能够更快地执行提交或回滚事务,并减少不必要的等待时间。需要注意的是,与 2PC 协议相比,3PC 协议仍然可能存在阻塞的问题。

3.两阶段提交 VS 三阶段提交

2PC 和 3PC 是分布式事务中两种常见的协议,3PC 可以看作是 2PC 协议的改进版本,相比于 2PC 它有两点改进:

  1. 引入了超时机制,同时在协调者和参与者中都引入超时机制(2PC 只有协调者有超时机制);
  2. 3PC 相比于 2PC 增加了 CanCommit 阶段,可以尽早的发现问题,从而避免了后续的阻塞和无效操作。

也就是说,3PC 相比于 2PC,因为引入了超时机制,所以发生阻塞的几率变小了;同时 3PC 把之前 2PC 的准备阶段一分为二,变成了两步,这样就多了一个缓冲阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。

4.数据一致性问题和解决方案

3PC 虽然可以减少同步阻塞问题和单点故障问题,但依然存在数据一致性问题(概率很小),而解决数据一致性问题的方案有很多,比如 Paxos 算法或柔性事物机制等。

4.1 Paxos 算法

Paxos 算法是一种基于消息传递的分布式一致性算法,并在 2013 年获得了图灵奖。
图灵奖(ACM A.M. Turing Award)是计算机科学领域最高荣誉之一,由美国计算机协会(ACM)于 1966 年设立,每年颁发一次,表彰对计算机科学领域做出杰出贡献的人士或团体。
简单来说,Paxos 算法是一种分布式共识算法,用于在分布式系统中实现数据的一致性和共识,保证分布式系统中不同节点之间的数据同步和一致性。
Paxos 算法由三个角色组成:提议者、接受者和学习者。当一个节点需要发起一个提议时,它会向其他节点发送一个提议,接受者会接收到这个提议,并对其进行处理,可能会拒绝提议,也可能会接受提议。如果有足够多的节点接受了该提议,那么提议就会被确定下来,并且通知给所有学习者,最终所有节点都会达成共识。
Paxos 算法看起来很简单,但它实际上是非常的复杂。
Paxos 算法应用的产品也很多,比如以下几个:

  • Redis:Redis 是一个内存数据库,使用 Paxos 算法实现了分布式锁服务和主从复制等功能。
  • MySQL:MySQL 5.7 推出的用来取代传统的主从复制的 MySQL Group Replication 等。
  • ZooKeeper:ZooKeeper 是一个分布式协调服务,使用 Paxos 算法实现了分布式锁服务和数据一致性等功能。
  • Apache Cassandra:Cassandra 是一个分布式数据库系统,使用 Paxos 算法实现了数据的一致性和复制等功能。
  • Google Chubby:Chubby 是 Google 内部使用的分布式锁服务,使用 Paxos 算法实现了分布式锁服务和命名服务等功能。

4.2 柔性事务

柔性事务机制:允许一定时间内不同节点的数据不一致,但要求最终一致的机制。
柔性事物有 TCC 补偿事物、可靠消息事物(MQ 事物)等。

小结

在分布式事务中,通常使用两阶段或三阶段提交协议来保障分布式事务的正常执行。两阶段协议包含准备阶段和提交阶段,然而它存在同步阻塞问题、单点故障和数据一致性问题。而三阶段协议可以看作是两阶段协议的改进版,它将两阶段的准备阶段一分为二,多了一个询问阶段,保证了提交阶段之前各参与节点的状态是一致的,同时引入了超时机制,减少了同步阻塞问题发生的几率。但 2PC 和 3PC 都存在数据一致性问题,此时可以采用 Paxos 算法或柔性事务机制等方案来解决事务一致性问题。

参考 & 鸣谢

https://pdai.tech/md/arch/arch-z-transection.html

本文已收录到我的小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:事务,协调者,阶段,提交,参与者,分布式
From: https://www.cnblogs.com/vipstone/p/17584074.html

相关文章

  • git操作-删除.git里提交的大文件
    有时我们的gitignore没有配置,导致一些大文件被误提交上去~1.先找到大文件(如果你已经知道是哪个文件以及该文件的路径,可直接进行第二步)gitverify-pack-v.git/objects/pack/pack-*.idx|sort-k3-g|tail-5这行命令是找到排名前5的大文件存在的git记录,从小到大排列。......
  • 分布式服务如何保证幂等性,幂等性如何设计
    1)建唯一索引:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增异常时,再查询一次就可以了,数据应该已经存在了,返回结果即可)。2)token机制:token机制的幂等保障的主要流程就是:服务端提供了发送token的接口。我们在分析业务的时候,哪些业务是......
  • Java程序员进阶之路----四阶段
    第一阶段:JavaSE全面深入的学系JavaSE课程,主要内容包括Java概述与环境搭建、基本语法、面向对象基础、接口、抽象类、常用类(Object/内部类/包装类/String等)、集合、算法和数据结构、异常、多线程、I/O框架、网络编程、JDK8新特性、JVM内存模型、反射、注解xml等。本阶段学......
  • layui 表单提交
    新手小白,使用layui的时候,表单如何像普通表单那样提交呢?如下:只需要在回调函数里返回true,并且在form表单正常添加action和method属性就行!如果返回false;将会拦截 阻止默认form跳转,此时可以在函数里通过ajax进行数据交互 <formclass="layui-form"action="${basepat......
  • java分布式事务
    1、2pc原理准备阶段、提交阶段、回滚 协调者和参与者二阶段和三阶段cap定律:可用性,一致性、分区容错性 ......
  • (五) MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图
    (五)MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图 上一篇:(四)MdbCluster分布式内存数据库——业务消息处理本节主要讨论在系统扩容期间的数据迁移架构及节点的状态图。我们将通过介绍这两部分,慢慢展开复杂的扩缩容流程。下图从左到右,我们增......
  • springcloud- 分布式session,全局session共享的解决方案
     1.导入依赖     <dependency>       <groupId>org.springframework.session</groupId>       <artifactId>spring-session-data-redis</artifactId> <!--     <version>2.3.0.RELEASE</version>-->......
  • 代理IP的扩展和分布式部署策略​
    代理IP的扩展和分布式部署策略在如今信息爆炸的时代,网络抓取已经成为许多行业中必不可少的一环。而要进行网络抓取,使用代理IP是一种常见的方式。然而,在应对大规模数据爬取的需求时,我们需要考虑代理IP的扩展和分布式部署策略,以提高网络抓取的稳定性和效率。本文将向您介绍一些关键策......
  • 分布式操作系统是操作系统的终极形态吗?
    昨天一位网友私信我,提出一个问题:“Laxcus分布式操作系统会不会是操作系统发展的终极形态?”。今天觉得有必要把这件事说一说,所以就忙里偷闲写下这篇文章。咱们先说结论:是也不是,需要具体情况具体分析。操作系统发展到今天,基本分为两种:面向个人工作的操作系统,和面向企业业务的操作系统......
  • 分布式存储在云环境下的应用和部署
    随着互联网数据规模越来越大,并发请求越来越高,传统的关系数据库系统在性能、价格、可扩展性方面已经不能很好地满足需求。谷歌、亚马逊等互联公司率先在后台基础设施中引入超大规模分布式存储系统,用来解决海量数据的存储问题。与传统的集中式存储技术不同,分布式存储没有将数据存储在......