分布式事务:两阶段提交与三阶段提交
两阶段提交与三阶段提交
- 分布式事务
- 二阶段提交
- 请求阶段
- 提交阶段
- 举例
- 故障分析
- 柜员侧出现故障或拒绝Proposal
- 第一阶段经理侧出现故障
- 第二阶段经理侧出现故障
- 二阶段提交存在的问题
- 三阶段提交
- canCommit阶段
- preCommit阶段
- doCommit阶段
- 特点
- 参考
分布式事务
满足ACID(原子性、一致性、隔离性、持久性)的一组操作,可以被称为一个事务。随着计算机系统的发展,越来越多的采用分布式的架构来对外提供服务,但是,不同的机器的处理性能、存储性能、网络状态等各有不同,让分布式集群始终对外提供可用的一致性服务一直是需要处理的问题。
为了保证数据变更请求在整个分布式环境下正确地执行,不会导致部分服务器暂时崩溃导致整个集群提供的服务和数据不再相同,在整个分布式系统处理数据变更请求的过程中,需要引入分布式事务的概念。常见的提交方式有二阶段提交(Two-phase Commit,2PC)和三阶段提交(Three-phase commit,3PC)。
二阶段提交
二阶段提交的底层实现主要分成两个阶段:
- 请求阶段
- 提交阶段
请求阶段
协调者通知每个参与者准备提交;
参与者在本地执行事务:
- 执行成功后,并不提交,告知协调者自己本地已经执行成功;
- 执行失败后,告知协调者本地作业执行故障
提交阶段
协调者根据第一阶段收集到的参与者的返回信息,决定是否提交:
- 如果全部的参与者都反馈成功,那么协调者通知所有参与者提交事务
- 如果存在参与者反馈失败,则协调者通知所有参与者取消事务
收到全部参与者的成功commit信息后,完成本次提交
举例
还是使用经理和柜员的例子。银行有一个经理和三个柜员,客户举老爷子申请存钱1000元,需要最终三个柜员将举老爷子余额+1000记录下来。
需要注意这里经理向柜员发送proposal和提交是广播出去的。
故障分析
柜员侧出现故障或拒绝Proposal
假如一个柜员暂时离开了,或者柜员这边发现今天不能存入钱了,如下图所示:
第一阶段经理侧出现故障
假如经理突然寄了,那么时间可能正好在第一阶段或第二阶段。
第一阶段如果经理寄了,经理无法收到柜员的存钱处理完成的消息
则这个存钱事务一直没有被提交,举老爷子的钱也没有增加1000元。
第二阶段经理侧出现故障
如果在发送COMMIT的消息的过程中,发送了一部分之后,经理寄了
此时数据会产生不一致。若经理重启,首先看自己的日志到哪了,然后依次去询问柜员最新的commit信息。
二阶段提交存在的问题
- 参与者阻塞
若某个参与者一直没有完成,则需要等待他完成。例如某个柜员业务不熟悉操作很慢,那么客户和经理需要一直等待他完成操作,才能一起进入下一步 - 单点故障
若协调者寄了,那么参与者长期阻塞 - 存在数据不一致情况
若协调者在第二阶段挂了,那么会产生数据不一致的情况。
三阶段提交
三阶段提交在二阶段算法的基础上进行了优化和改进。如下图所示,在整个三阶段提交的过程中,相比二阶段提交,增加了预提交阶段。
canCommit阶段
协调者首先询问所有的参与者的状态,当前是否可以执行业务;如果可以\不可以执行,就直接返回可以/不可以。
preCommit阶段
协调者根据参与者canCommit阶段的响应来决定是否可以继续事务的preCommit操作。preCommit阶段和二阶段提交里面的请求阶段一致
协调者通知每个参与者准备提交;
参与者在本地执行事务:
- 执行成功后,并不提交,告知协调者自己本地已经执行成功;
- 执行失败后,告知协调者本地作业执行故障
doCommit阶段
协调者根据参与者preCommit阶段的响应来决定是否可以继续事务的doCommit操作。
发送doCommit后,若接收到了所有参与者的haveCommitted响应,则执行成功;若仅接收到了部分haveCommitted响应,则事务执行中断。
特点
相比2PC,引入超时机制,减少了阻塞问题。此外,增加了一个询问阶段,询问阶段可以确保尽可能早的发现无法执行操作而需要中止的行为。
但是,仍然存在数据不一致问题,在第三阶段如果只有一个参与者收到了abort操作指令,协调者和其他的参与者都会超时,协调者和参与者都继续提交事务,默认为成功,导致数据不一致。
参考
两阶段提交和三阶段提交
二段提交协议与三段提交协议
28 彻底掌握二阶段提交三阶段提交算法原理
两阶段提交(Two-Phase Commit)
分布式事务:两阶段提交与三阶段提交相关推荐
- 分布式两阶段提交和三阶段提交
随着大型网站的各种高并发访问.海量数据处理等场景越来越多,如何实现网站的高可用.易伸缩.可扩展.安全等目标就显得越来越重要. 为了解决这样一系列问题,大型网站的架构也在不断发展.提高大型网站的高可用架 ...
- 两阶段提交和三阶段提交
分布式提交的问题 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上. 在数据有多份副本的情况下,如果网络.服务器或者软件出现故障,会 ...
- 浅谈两阶段提交和三阶段提交
本文主要分为三个部分 第一部分阐述两阶段提交的原理和优缺点. 第二部分阐述三阶段提交的原理和优缺点. 第三部分阐述如何解决业务中最终一致性的问题. 一.两阶段提交 两阶段提交方法是用于分布式事务中用来 ...
- 二阶段提交,三阶段提交,Paxos
本文转载自:http://blog.csdn.net/u010191243/article/details/52081891 http://blog.chinaunix.net/uid-1672327 ...
- 分布式事务两阶段提交
前言 不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付.又或者在网上购物明明已经扣款,但是却告诉我没有发生交易.这一系列情况都是因为没 ...
- 与基础事务管理器的通信失败 存货申请_干货必读!细说分布式事务两阶段提交...
本文作者:旺德,阿里云数据库高级开发工程师 事务的概念在这篇文章中描述过,在分布式系统中,读写位于多个节点的数据,如果依旧想保证ACID特性,就必须实现分布式事务.而其实现关键则是适当的提交协议,目前 ...
- CAP原理,分布式一致性算法,两阶段提交,三阶段提交,Paxos,Raft,zookeeper的选主过程,zab协议,顺序一致性,数据写入流程,节点状态,节点的角色
我们知道,一般在分布式应用都有CAP准则: C Consistency, 一致性,分布式中的各个节点数据保持一致 A availability 可用性,任何时刻,分布式集群总是能够提供服务 P par ...
- 分布式架构--两阶段提交和三阶段提交
在分布式系统中,著有CAP理论,该理论由加州大学伯克利分校的Eric Brewer教授提出,该理论阐述了在一个分布式系统中不可能同时满足一致性(Consistency).可用性(Availabilit ...
- oracle二阶段事物,分布式事务 两阶段提交 (2PC)
两阶段提交(2PC) 是 Oracle Tuxedo 系统提出的 XA 分布式事务协议的其中一种实现方式. XA协议中有两个重要角色:事务协调者和事务参与者 既然叫两阶段提交,肯定是分为两个阶段. J ...
最新文章
- 时间序列(五)股票分析
- 程序员 35 岁就该退休了吗?
- Java jvisualvm简要说明
- chrome经常崩溃解决过程
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - B. 星系炸弹
- Master of GCD(差分数组||线段树)
- 前端学习(1095):ES5新增方法
- 未捕获的异常 'NSInternalInconsistencyException'
- 【LeetCode笔记】剑指 Offer 58 - I. 翻转单词顺序(Java、栈、双指针)
- Java FilterInputStream skip()方法与示例
- mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...
- GCD(Grand Central Dispatch)和Block 使用-浅析
- 虚拟化技术发展编年史
- ENVI入门系列教程---一、数据预处理---8.图像裁剪
- Citrix为什么要兼容第三方服务器虚拟化平台
- [软件应用]常用软件名录
- python spyder下载_2.4 熟悉Anaconda3的开发工具——Spyder
- 操作系统-3.假设某多道程序设计系统中有供用户使用的内存100KB,打印机1台。系统采用可变分区方式管理内存:对打印机采用静态分配,并假设输入输出操作的时间忽略不计;采用最短剩余时间优先的进程调度算法
- 人工智能产品经理最佳实践
- 财经365热点:当阿里巴巴不再讲“中台”