`
yale
  • 浏览: 356742 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

分布式事务设计-三段式提交

阅读更多

前面的文章提到的两段式提交,已经能够很好得解决分布式事务了,然而两阶段在即使只有一个进程发生故障时(协调员发生故障了),那么整个系统中也会存在较长时间的block(参与者进程需要block直至协调员恢复,或者与其他参与者进程进行协同终止协议,直至获得决定)。但如果只有个别进程发生故障,就要长时间得被block住这就令人无法忍受,这个block时间能否减少。于是,3段式提交设计出现。在实际应用中,由两阶段引起的block的情况很少见,因此即使被block住了,时间稍微长一点的block开销也是可以接受的。因此两阶段是实际系统中经常被采用的方法。但三阶段作为一种理论上的设计也很有借鉴意义。

 

三阶段基础架构

假设系统中只会有服务器进程发生故障,但不会有通信故障,也就是说这是一个理想的强连通网络拓结构,任何站点的故障都不会影响另外两点的链路通信。这个假设意味着什么呢?意味着如果一个服务器进程p,它在等待来自q进程的消息时发生了timeout,那么我们就可以知道q发生了故障,其它任何进程也无法和q进行通信。

在两阶段中,如果一个可工作的参与者进程处于不确定周期,那么它就都处于block状态。由于timeout,它其实此时已经知道,此时协调员已经故障了(由于网络拓扑结构的强连通性假设),但此时它也不能单方面得决定ABORT,因为有可能协调员在故障之前已经做出了COMMIT的决定,并且有的参与者进程已经开始实施达成该决定,说不定COMMIT操作都已经完成了。

如果任何一个可工作的进程处在不确定状态,那么任何进程(不管是可正常工作的还是已经发生故障的)都不可能确定该决定。

有了这个特性,就可以解决进程中的block问题,设想一下,如果一个处于不确定状态下的进程timeout了,在两阶段下它有两种选择,要么继续等待直至恢复与协调员的通讯,要么与其他参与者进行协同终止协议。这两种选择都需要该进程继续block。而如果具有了三阶段特性,那么该进程知道此时整个系统的其他任何进程都没有真正得开始实施事务操作(具体的COMMIT或者ABORT操作),因此进程可以直接ABORT ACCEPT,无需继续block等待。发生故障的进程恢复后,也能够得知:原来在我故障的时候,大家都决定ABORT了,我知道了,我该干嘛干嘛去了。

其思路很简单。两阶段为什么不满足?来看一下,在参与者还都是不确定状态时,协调员发送了COMMIT DECISION消息。如果一个参与者进程p先收到了该消息,另一个参与者q此时还未收到该消息,那么p马上就开始实施达成这个决定(申请锁,往数据库里写数据等等一系列操作紧锣密鼓得进行着),但此时q还在处在不确定状态,静悄悄得毫无声息。而三阶段则巧妙得避免了这种情况,它增加了一个阶段,在收到了所有的参与者的YES投票之后,协调员发送一个PRE-COMMIT消息给所有的参与者,当某一参与者进程收到PRE-COMMIT消息之后它得知其他进程已经协商出了COMMIT决定,于是他就可以脱离不确定状态了。但是需要注意的是,此时p并不进行任何实质具体的决定达成实施工作,他只是做出承诺,如果自己一切正常,那么它将会在未来实施达成该决定。

每个参与者进程都会回复确认这个PRE-COMMIT。当协调员已经收到了所有参与者进程的PRE-COMMIT确认后,它就可以确认已经没有参与者进程还处在不确定期内。然后它就发送COMMIT决定到所有的参与者进程,然后参与者进程就可以开始实施达成该决定了。此刻没有参与者进程处在不确定期了,决定当然可以开始实施达成了。

如果参与者投票是NO,三阶段的处理方式就和两阶段相同。三阶段的协议框架如下:

1. 协调员进程发送投票请求给所有的参与者进程

2. 当一个参与者进程收到了投票请求,它会根据自己的情况回应YES 或者NO。如果参与者回应NO,那么参与者实施ABORT ACCEPT的决定,然后停止该参与者事务进程。(为什么要停止参与者进程呢?因为实际实现的时候,每个事务往往是分配了一个专门的进程来处理的,停止了进程也就意味着该事务的处理停止了)。

3. 协调员进程收集所有来自参与者进程的投票信息,如果参与者进程有人投了NO,或者协调员进程本身基于某种考虑也投了NO,那么协调员进程就发送ABORT DECISION给所有偷了YES的参与者进程,各个参与者进程接受了ABORT DECISON决定,实施该决定需要进行的操作(释放锁啊等等),然后停止参与者进程。否则协调员进程就发送PRE-COMMIT信息给所有的参与者进程。

4. 一个投了YES的参与者进程等待来自协调员的PRE-COMMIT或者ABORT决定消息。如果收到了ABORT,那么就实施该决定并停止该事务进程。如果收到了PRE-COMMIT,那么参与者进程就回复消息给协调员。

5. 协调员收集所有的消息,如果所有的参与者进程都回复消息,那么协调员进程就发送COMMIT消息给所有的参与者进程,然后停止该事务的协调员进程的工作。

6. 参与者进程等待来自协调员的COMMIT消息,收到消息之后就开始实施该决定然后停止该事务的实施进程。

这就是三阶段设计,当然它实施起来也需要考虑Timeout,终止协议,日志恢复等一系列细节问题,这些细节大家可以参考之前两阶段的文章。三阶段相对于两阶段减少了由故障引起的block的等待时间,但它增加了网络开销。如果一个系统的故障率不是那么高,两阶段还是要优于三阶段的。实际上大多数的系统的故障率的开销还是比较小的,这也是大部分的分布式事务协议(本质上也是一种分布式一致性协议,因为它使得各个服务器都实施达成一个一致的决定)实现还是基于两阶段的较多。两阶段和三阶段也是理解一致性算法的一个基础。

分享到:
评论

相关推荐

    分布式数据库试题及答案.doc

    2.9.3. 对于每一种失败类型,在失败发生情况下,两段提交机制如何保证事务的原子性? 14 3. 九九年秋季试题 14 3.1. 问答题 14 3.1.1. 分布式数据库系统在系统结构、模式结构、功能模块等方面有何特点? 14 3.1.2. ...

    研究生分布式数据库参考习题

    2.9.3. 对于每一种失败类型,在失败发生情况下,两段提交机制如何保证事务的原子性? 14 3. 九九年秋季试题 14 3.1. 问答题 14 3.1.1. 分布式数据库系统在系统结构、模式结构、功能模块等方面有何特点? 14 ...

    数据库系统实现

    书中对数据库系统实现原理进行了深入阐述,并具体讨论了数据库管理系统的三个主要成分—存储管理器、查询处理器和事务管理器的实现技术。书中还对信息集成的最新技术,例如数据仓库、OLAP、数据挖掘、Mediator、数据...

    数据库系统-招标参数---模板.doc

    具有多种复制功能模块 " " " "支持ODBC 3.0、X/Open XA、CLI、JDBC等标准 " " " "支持分布式事务及两阶段提交功能 " " " "支持动态将锁粒度调整到合适的级别,支持动态行" " " "级锁定 " " " "支持高可用性组,可以...

    oracle数据库dba管理手册

    7.1.3 为事务处理指定回滚段 169 7.2 回滚段的空间使用 169 7.3 监控回滚段使用 173 7.3.1 监控当前空间分配 173 7.3.2 收缩回滚段 173 7.3.3 监控当前状态 174 7.3.4 监控动态扩展 174 7.3.5 每个回滚段中的事务 ...

    ORACLE9i_优化设计与系统调整

    §9.9.1 分布式系统 110 §9.9.2 多层系统 110 §9.9.3 Oracle并行服务器 110 §9.10 Oracle数据库增长的规划 111 §9.10.1 不同增长表的配置 111 §9.10.2 对增长表进行规划和分析 112 第10章 数据库结构设计要点 ...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    软件工程知识点

    概要设计是针对软件系统的结构设计,用于从总体上对软件的构造、接口、全局数据结构和数据环境等给出设计说明,并以“概要设计说明书”的形式提交书面报告,其结果将成为详细设计与系统集成的基本依据。 模块是概要...

    Spring面试题

    7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    4.2.2 分布式事务处理、XA规范和 2PC协议 192 4.2.3 使用JTA全局事务保证多 数据库的一致性 193 4.3 事务隔离、传播属性的设置 198 4.3.1 并发访问和隔离 198 4.3.2 事务属性 199 4.4 EJB的事务管理 201 4.4.1 容器...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    asp学习相关资料大全

    除了可用VBscript或Jscript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其他脚本语言,譬如Perl、Tcl等。脚本引擎是处理脚本程序的COM(Component Object Model)组件。 (6)Active Server Pages的...

Global site tag (gtag.js) - Google Analytics