1. 流程

1) Coordinator (协调者) 广播 VOTE-REQ 给所有 Participant (参与者)

2) Coordinator 等待 Participant 的结果

3) Participant 回复 YES or NO 给 Coordinator

4) Coordinator 收集所有结果后, 广播 COMMIT or ABORT 给所有 Participant

其中, 当 Participant 处于 状态 3 与 状态 4 之间的时候(已经发送 YES 并等待 Coordinator 的回复)称之为不确定状态, 这个状态处于阻塞状态

2. 超时协议

Participant 与 Coordinator 可能会处于无法通信的状态, 这时候可以有不同的处理策略

1) Termination Protocol

在与协调者的通信恢复之前p始终保持阻塞。之后,协调者通知p对应的决定结果。协调者肯定支持这样做,因为它没有不确定区间。该terminaion protocol满足AC5,因为如果所有的故障都修复了的话,p就能与协调者通信,然后就能达到决定状态。
 
这种简单的terminaion protocol缺点在于,p可能要经历不必要的阻塞。比如,假设现在有两个参与者p和q。协调者先给q发送了一个COMMIT或ABORT消息,但是在发送给p之前发生了故障。因此,尽管p是不确定的,但是q不是。如果p可以与q进行通信,那么它就可以从q那得知最终的决定结果。并不需要一直等待着协调者的恢复。

2) Cooperative Termination Protocol

参与者p如果在不确定区间超时,它会发送一个DECISION-REQ消息给所有其他进程,设为q,问下q是否知道决定结果或者能否单方面地做出决定。在这个场景中,p是initiator,q是responder。有如下三种情况:
1. q已经决定进行Commit(或Abort):q简单地发送一个COMMIT(或ABORT)消息给p,然后p进行相应动作
2. q还未进行投票:q可以单方面地决定进行Abort。然后它发送ABORT消息给p,p会因此决定进行ABORT
3. q已经投了Yes但是还未做决定:q也是处于不确定状态,因此无法帮助p达成决定。
 
对于该协议来说,如果p可以同某个进程q通信并且上述1或2成立,那么p就可以不经阻塞地达成决定。另一方面,如果p通信的所有进程都是3成立,那么p就会被阻塞。那么p将会一直阻塞,直到故障修复的出现了某个进程q满足条件1或2为止。

3. 故障

Coordinator 和 Participant 有可能会发生故障, 故障恢复后, 需要根据发生故障时的状态来决定, 所以需要将各个状态写入 DT log

* 如果DT log包含一个start-2PC记录,那么说明S就是协调者所在节点。如果它还有commit(或abort)记录,那么说明在发生故障前协调者已经做出了决定。如果这两种记录(commit或abort)都没有找到,那么协调者可以通过向DT log中插入一条abort记录来单方面地决定进行Abort。这样可以工作的关键在于,协调者是先将commit记录写入DT log,然后再发送COMMIT消息的(上面的第3点)。
* 如果DT log中没有start-2PC记录,那么S就是参与者节点。那么有如下三种可能:
* DT log中包含一个commit(或abort)记录。那么说明在发生故障之前,参与者已经达成了决定。
* DT log中没有yes记录。那么要么是参与者是在投票前发生的故障,要么投的是No(但是在发生故障前还没有完成abort记录的写入)。(这也是为何yes记录必须要在发送YES消息前写入日志的原因;参考上面的第2点。)因此,它可以单方面地通过向DT log中写入一条abort记录决定进行Abort。
* DT log中包含了yes记录,但是没有commit(或abort)记录。那么说明参与者是在不确定区间内发生的故障。它可以通过使用terminaion protocol来达成决定。回想一下,yes记录中包含了协调者名称以及所有的参与者,这正是terminaion protocol所需要的。
 
整理自 
http://duanple.blog.163.com/blog/static/70971767201311810939564
http://research.microsoft.com/en-us/people/philbe/chapter7.pdf

Two-Phase Commit (两阶段提交)的更多相关文章

  1. MySQL binlog 组提交与 XA(两阶段提交)

    1. XA-2PC (two phase commit, 两阶段提交 ) XA是由X/Open组织提出的分布式事务的规范(X代表transaction; A代表accordant?).XA规范主要定义 ...

  2. MySQL binlog 组提交与 XA(两阶段提交)--1

    参考了网上几篇比较靠谱的文章 http://www.linuxidc.com/Linux/2015-11/124942.htm http://blog.csdn.net/woqutechteam/ar ...

  3. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  4. 基于两阶段提交的分布式事务实现(UP-2PC)

    引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...

  5. 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...

  6. 分布式事务(一)两阶段提交及JTA

    原创文章,同步发自作者个人博客 http://www.jasongj.com/big_data/two_phase_commit/ 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或 ...

  7. Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证

    Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证 1.1. ACID解决方案1 1.2. 数据库厂商在很久以前就认识到数据库分区的必要性,并引入了一种称为2PC( ...

  8. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  9. MySQL源码之两阶段提交

    在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version配置: sync_binlog=1 innodb_flush_log_at_trx_comm ...

随机推荐

  1. 全景视频外包团队:技术分享Unity3D全景漫游

    作者:未知 1.建模中使用的图片.文件.文件夹等以及模型中物体.材质等的名称都不能使用中文或者特殊符号,可以使用英文字母.数字.下划线等 2.调整Max的单位为米 3.烘培光影的设置 4.模型的中的植 ...

  2. node.js和express.js安装和使用步骤 [windows]

    PS: NODEJS:https://nodejs.org NPM:https://www.npmjs.com/ 一.node.js安装与配置 到https://nodejs.org/en/downl ...

  3. Oracle存储过程 输出参数赋值异常:“Oracle.DataAccess.Types.OracleString”的类型初始值设定项引发异常。

    场景: 写了一个有返回参数的存储过程,在个另开发人员机器上都正常.其它机器报如题错误.让人郁闷的是,所有调用方都是客户端,根本不存在网上众贴所说的版本不一致问题. 分析: 虽然网上的帖子没有根本解决问 ...

  4. Android总结篇系列:Activity Intent Flags及Task相关属性

    同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...

  5. log4j打印mybatis sql语句

    Mybatis默认使用有slf4j 必须加上依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId& ...

  6. 一些代码 II (ConfigParser、创建大文件的技巧、__getattr__和__getattribute__、docstring和装饰器、抽象方法)

    1. ConfigParser format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s ...

  7. python_day2

    一.字符串的基本使用 #!/usr/bin/env python #!-*- coding:utf-8 -*- #!/usr/bin/env python  指定解释器为python abc='hel ...

  8. BMP图片格式

    BMP图片 BMP采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit和32bit.BMP文 ...

  9. Flex中使用CSS控制页面样式

    Using file: Stylebounding.mxml Stylebounding2.mxml myCSS0329.css 在Flex4中使用CSS控制样式,既可以直接在MXML文件中写样式,也 ...

  10. python __init__.py用途

    转自http://www.cnpythoner.com/post/2.html Python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时, ...