两阶段提交协议的异常处理

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt371

两阶段提交的协议大家都比较熟悉了,解释一下每个阶段的异常处理。首先,我们需要持久化协议过程中的状态,这样如果server宕机,那么恢复的时候还能通过日志知道宕机前处于那个阶段。同时,所有对数据的修改都会先写write ahead log,保证宕机重启的之后数据也不会丢失。写日志的顺序假定为:写write ahead log-修改缓冲区-写commit/abort log。

在这个前提下,我们根据如下的时序图来讨论异常情况和处理方法。

两阶段提交协议时序

  1. 过程a没有成功,即协调者没有收到部分参与者的回应。超时后,协调者发送abort消息给参与者取消事务。参与者存在两种情况:
    • 过程1失败,网络问题导致参与者没有收到vote request消息或者此时参与者宕机。参与者重启恢复后无需做任何事。
    • 过程2失败,参与者收到了vote request,网络问题协调者没有收到回复或此时参与者宕机。参与者宕机恢复或等待超时后广播DECISION_REQUEST消息向其他参与者询问是否收到commit/abort消息。
  2. 过程b没有成功,即协调者发送commit消息之后没有收到部分参与者的回应。协调者需要重试,确认参与者的提交完毕消息,如果多次尝试不能联系上,则等待参与者上线之后解决。参与者存在两种情况:
    • 过程3失败,网络问题导致参与者没有收到commit消息或此时参与者宕机。参与者上线发现在本地日志中发现尚未提交成功,因为到达这里,可以肯定本地已做好提交准备,但是不知道协调者是决定提交,所以向协调者询问,按协调者的回复来进行提交或回滚。如果无法联系上协调者,则向其他参与者询问事务状态,如果有某一个节点已经做了提交或异常终止(说明协调者已发送了相关消息),则做同样的操作。
    • 过程4失败,参与者完成了commit/rollback,但是网络问题协调者没有收到回应或者此时参与者宕机。参与者在本地日志中发现已完成本地提交,所以可能由于网络故障导致提交完成消息没有到达协调者。所以直接忽略。这时可能协调者在等待该参与者的提交完成回应消息,所以参与者主动联系协调者告知事务状态。
  3. 过程c没有成功,即参与者发送vote回应消息之后没有等到协调者的commit/rollback消息。这个过程参与者的异常处理已经讨论过了,这里讨论协调者的异常处理。存在两种情况:
    • 过程2失败,网络问题导致协调者没有收到回复或此时协调者宕机。协调者恢复重启后,发现并未做提交操作,保险操作(因为不知道它是否发送过准备消息,或其他参与者是否做好提交准备),直接发送abort消息给所有参与者,终止事务
    • 过程3失败,网络问题导致参与者没有收到commit/rollback消息或者此时协调者宕机。协调者恢复重启后,不能保证所有参与者都已收到了提交消息,所以给所有的参与者发送commit消息,保证事务的正常提交。
时间: 2024-10-18 07:25:06

两阶段提交协议的异常处理的相关文章

分布式协议之两阶段提交协议(2PC)和改进三阶段提交协议(3PC)

一. 事务的ACID 事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性. A是Atomicity,原子性.一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操 作成功,而另外一部分操作没有成功.如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态.比如银行的转账服务, 这个事务的最终结果一定是:某个账户的余额增加了x,而另外一个账户的余额减少了x,或者两个账户的余额未发生变化.而不

分布式系统理论之两阶段提交协议

一,两阶段提交协议介绍 两阶段提交协议是用来保证分布式系统事务的协议.在分布式系统中,一个事务需要由多台机器协调完成,机器之间通过网络来通信,如何保证一组操作在多台机器上要么都做,要么都不做呢?(事务的ACID特性) [比如,一个事务包括三个操作A,B,C,操作A,B,C分别 在机器1,2,3上完成,如果机器1成功提交了操作A,机器2成功提交了操作B,但是机器3执行操作C失败了,则需要撤消所有的操作……] 再扩展一下,把两阶段提交协议用到保证多个数据副本一致性的情景下,可以说:它是一种强一致性的

两阶段提交协议

集中式与分布式事务的另一个重要的不同点在于它们各自所需关注的错误的属性上.在集中式系统中,错误都是要么不错要么全错(all-or-nothing),也就是说要么系统正常工作事务正常处理,要么系统出错不会有任何事务完成.但是在分布式系统中,可能出现部分失败(partial failures)的情况,某些节点正常工作但是其他一些节点出错了. 这种局部失败的情况正是造成分布式系统中很多难解的问题的根源.在事务处理中就有这样的一个难解问题,即分布式事务的一致性问题.比如T就可能在某些节点上进行了Comm

关于分布式事务、两阶段提交协议、三阶提交协议

随着大型网站的各种高并发访问.海量数据处理等场景越来越多,如何实现网站的高可用.易伸缩.可扩展.安全等目标就显得越来越重要. 为了解决这样一系列问题,大型网站的架构也在不断发展.提高大型网站的高可用架构,不得不提的就是分布式.在<分布式系统的一致性探讨>一文中主要介绍了分布式系统中存在的一致性问题.本文将简单介绍如何有效的解决分布式的一致性问题,其中包括什么是分布式事务,二阶段提交和三阶段提交. 分布式一致性回顾 在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(repli

分布式事务、两阶段提交协议、三阶提交协议

为了解决这种分布式一致性问题,前人在性能和数据一致性的反反复复权衡过程中总结了许多典型的协议和算法.其中比较著名的有二阶提交协议(Two Phase Commitment Protocol).三阶提交协议(Three Phase Commitment Protocol)和Paxos算法. 一.分布式事务 分布式事务是指会涉及到操作多个数据库的事务.其实就是将对同一库事务的概念扩大到了对多个库的事务.目的是为了保证分布式系统中的数据一致性.分布式事务处理的关键是必须有一种方法可以知道事务在任何地方

mysql的两阶段提交协议

http://www.cnblogs.com/hustcat/p/3577584.html 前两天和百度的一个同学聊MySQL两阶段提交,当时自信满满的说了一堆,后来发现还是有些问题的理解还是比较模糊,可能是因为时间太久了,忘记了吧.这里再补一下:) 5.3.1事务提交流程 MySQL的事务提交逻辑主要在函数ha_commit_trans中完成.事务的提交涉及到binlog及具体的存储的引擎的事务提交.所以MySQL用2PC来保证的事务的完整性.MySQL的2PC过程如下: [email pro

浅谈mysql的两阶段提交协议

转自: http://www.cnblogs.com/hustcat/p/3577584.html 5.3.1事务提交流程 MySQL的事务提交逻辑主要在函数ha_commit_trans中完成.事务的提交涉及到binlog及具体的存储的引擎的事务提交.所以MySQL用2PC来保证的事务的完整性.MySQL的2PC过程如下: (1)先调用binglog_hton和innobase_hton的prepare方法完成第一阶段,binlog_hton的papare方法实际上什么也没做,innodb的p

OceanBase分布式事务以及两阶段提交实现详细设计

目前OceanBase中还存在updaeserver单点,下一步的开发任务是使得OB支持多点写入,支持多个UPS(及updateserver). 其中难点是如何设计两阶段提交的失败恢复以及多机的快照读写,和同事讨论后,形成一个可以work的简单设计版本,记录在此. 为分布式事务的两阶段提交细化具体流程,拟采用primary record方式实现失败恢复,即在进入commit阶段之前,先写入primary record 记录当前事务的状态(commit/rollback).Primary reco

两万字深度介绍分布式系统原理,一文入魂

链接 https://www.toutiao.com/i6776383707767898635/ 1 概念 1.1 模型 节点 在具体的工程项目中,一个节点往往是一个操作系统上的进程.在本文的模型中,认为节点是一个完整的.不可分的整体,如果某个程序进程实际上由若干相对独立部分构成,则在模型中可以将一个进程划分为多个节点. 异常 机器宕机:机器宕机是最常见的异常之一.在大型集群中每日宕机发生的概率为千分之一左右,在实践中,一台宕机的机器恢复的时间通常认为是24 小时,一般需要人工介入重启机器. 网