两阶段提交

简介: 【8月更文挑战第11天】

两阶段提交协议(Two Phase Commit)是分布式事务中的一种常见协议,算法思路可以概括为参与者将操作成败通知给协调者,再由协调者根据所有参与者的反馈情况决定各参与者要提交操作还是中止操作

可以分为两个阶段:准备阶段和提交阶段
)

  1. 准备阶段:协调者让参与者执行事务,但是并不提交,协调者返回执行情况。这个阶段参与者会记录Redo,Undo信息,用于后续提交和回滚
  2. 提交阶段:协调者根据准备阶段的情况,要求参与者提交或者回滚,参与者返回提交或回滚的结果。准备阶段任何一个节点执行失败了,就都会回滚。全部执行就提交。

两阶段提交协议缺点很多。最大缺点是在执行过程中节点都处于阻塞状态,也就是节点之间在等待对方的响应消息时,什么也做不了。特别是如果某个节点在已经占有了某项资源的情况下,为了等待其他节点的响应消息而陷入阻塞状态时,当第三个节点尝试访问该节点占用的资源时,这个节点也会连带着陷入阻塞状态。

此外,协调者也是关键,如果协调者崩溃,整个分布式事务都无法执行。所以,如果协调者是单节点,那么就容易出现单节点故障。而且协调者采用保守策略。如果一个节点在第一阶段没有响应,那么协调者会执行回滚。所以可能会引起不必要的回滚

这里还有一个问题,很少有人会想到。如果第二阶段,协调者发送Commit的时候,参与者没有收到会怎么样?
那么协调者会不断重试,直到请求发送成功

但是如果参与者已经收到了Commit请求,但是在提交前就宕机了又该怎么样?

参与者在恢复过来之后会查看自己本地的日志,看有没有收到Commit的指令,如果已经收到了,就会使用Redo信息来提交事务。
总的来说,两阶段提交协议是分布式事务中最常用的协议之一,它可以有效地保证分布式事务地一致性和可靠性

目录
相关文章
|
NoSQL Java 数据库连接
SpringBoot-搭建Mybatis项目
通过本文的学习,读者将了解如何使用IntelliJ IDEA快速搭建一个基于SpringBoot和Mybatis的Java Web应用程序,提高开发效率。
449 0
|
缓存 数据格式
实现LRU缓存的三种方式(建议收藏)
LRU全称为Least Recently Used,即最近使用的。针对的是在有限的内存空间内,只缓存最近使用的数据(即get和set的数据),超过有限内存空间的数据将会被删除。这个在面试题中也是常会被问到的内容,接下来就看看怎么来实现。
1789 0
实现LRU缓存的三种方式(建议收藏)
|
数据采集 运维 搜索推荐
手把手教你如何申请网站空间
网站空间就像房屋的地基,对网站运营的影响非常大。在网站还没有发布之前,首先需要考虑存放的空间。
1737 0
手把手教你如何申请网站空间
|
UED 网络架构 网络协议
五分钟了解一致性的分类及其理论
1、强一致性 这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。 2、弱一致性 这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不久承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。
1545 0
|
6月前
|
SQL 分布式计算 DataWorks
DataWorks产品测评|基于DataWorks和MaxCompute产品组合实现用户画像分析
本文介绍了如何使用DataWorks和MaxCompute产品组合实现用户画像分析。首先,通过阿里云官网开通DataWorks服务并创建资源组,接着创建MaxCompute项目和数据源。随后,利用DataWorks的数据集成和数据开发模块,将业务数据同步至MaxCompute,并通过ODPS SQL完成用户画像的数据加工,最终将结果写入`ads_user_info_1d`表。文章详细记录了每一步的操作过程,包括任务开发、运行、运维操作和资源释放,帮助读者顺利完成用户画像分析。此外,还指出了文档中的一些不一致之处,并提供了相应的解决方法。
|
7月前
|
数据采集 人工智能 自然语言处理
关于大模型语料的迷思
随着大模型发展的不断深入,我们越来越关注到语料质量对模型能力的影响,语料中的偏差和主观性会导致生成内容不准确或带有偏见。智能引擎事业部是阿里内部深耕多年的AI工程团队,为内部业务提供了完整的大模型工程体系,持续关注大模型训推性能、成本、研发范式等关键问题。本文将基于我们的思考,探讨大模型语料的复杂性及其背后的思维过程。
|
10月前
|
安全 测试技术 持续交付
微服务的测试策略
【8月更文第29天】随着微服务架构的普及,测试变得尤为重要,因为它有助于确保各个独立的服务都能正确运行并且能够协同工作。本文将介绍一种全面的测试策略,包括单元测试、集成测试和端到端测试,以及如何为微服务应用编写这些测试。
367 1
|
10月前
|
Java Shell Python
教你手把手安装JDK
教你手把手安装JDK
102 1
|
负载均衡 Java Apache
【微服务系列笔记】Feign
Feign是一个声明式的伪HTTP客户端,它使得HTTP请求变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解。
276 8
|
消息中间件 分布式计算 Kafka
硬核!Apache Hudi中自定义序列化和数据写入逻辑
硬核!Apache Hudi中自定义序列化和数据写入逻辑
217 1