精华内容
下载资源
问答
  • 两阶段提交(2PC) 准备阶段: 提交阶段: 2PC存在的问题: 三阶段提交(3PC) CanCommit: PreCommit(如果CanCommit阶段中所有参与者都返回“Yes”) DoCommit 3PC存在的问题: 3PC在2PC上的改动点: ...

    目录

    两阶段提交(2PC)

    准备阶段:

    提交阶段:

    2PC存在的问题:

    三阶段提交(3PC)

    CanCommit:

    PreCommit(如果CanCommit阶段中所有参与者都返回“Yes”)

    DoCommit

    3PC存在的问题:

    3PC在2PC上的改动点:


    两阶段提交(2PC)

    图片来源:https://medium.com/@balrajasubbiah/consensus-two-phase-and-three-phase-commits-4e35c1a435ac

     

    准备阶段:

    1.协调者:向所有参与者发出“Request-to-Prepare”,进入提交阶段。

    2.参与者:收到协调者的“Request-to-Prepare”,执行事务操作。

    (1)事务执行成功,并写入Undo log和Redo log,返回“Prepared”。

    (2)事务执行失败,返回“abort”。

     

    提交阶段:

    1.协调者:有超时机制
    (1)如果所有参与者应答“Prepared”,协调者向所有参与者发出“Commit”。等待所有参与者返回“Done”,结束事务。

    (2)如果存在参与者应答“Abort”,协调者向所有参与者发出“Rollback”。等待所有参与者返回“Done”,结束事务。

    (3)如果到达协调者的超时时间,仍未收到所有参与者的应答,则向参与者发出“Rollback”。

    2.参与者:

    (1)收到“Commit”,完成操作,并释放在整个事务期间内占用的资源和锁,返回“Done”。

    (2)收到“Rollback”,参与者利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源,返回“Done”。

     

    2PC存在的问题:

    1.参与者无超时机制:一旦参与者故障,可能导致事务资源一直被锁定(同步阻塞);协调者故障,导致所有参与者一直锁定事务资源(单点故障)。

    2.数据不一致:在提交阶段,部分参与者收到commit并执行commit,部分参与者因为网络等问题没收到消息导致无法执行事务提交。

    3.无法解决:在提交阶段,协调者在发出第一个commit后宕机,唯一收到此commit消息的参与者也宕机。协调者重新选举出来后也不知道事务应该提交还是不提交。

     

    三阶段提交(3PC)

    图片来源:https://en.wikipedia.org/wiki/Three-phase_commit_protocol

     

    状态扭转

    图片来源:https://developer.jboss.org/wiki/Three-phaseCommitProtocol

     

    CanCommit:

    1.协调者:协调者向所有参与者询问“CanCommit”,协调者变更为waiting状态,等待参与者应答

    (1)所有参与者返回“Yes”,协调者进入PreCommit阶段。

    (2)有参与者返回“No”,协调者中断事务,并发送“abort”给所有参与者,变更为“aborted”状态。

    (3)协调者等待超时,协调者中断事务,并发送“abort”给所有参与者,变更为“aborted”状态。

    2.参与者:判断是否能提交事务

    (1)能提交事务,返回“Yes”,变更为“waiting”状态。

    (2)不能提交事务,返回“No”,变更为“abored”状态。

    (3)接受到协调者的“abort”请求,变更为“aborted”状态。

     

    PreCommit(如果CanCommit阶段中所有参与者都返回“Yes”)

    1.协调者:发送“PrepareCommit”给所有参与者,协调者进入pre-commit状态,等待参与者应答。

    (1)所有参与者都返回“ack”,进入DoCommit阶段。

    (2)有参与者返回“abort”后,执行事务的中断,协调者向所有参与者发送“abort”,变更为“aborted”状态。

    (3)协调者等待参与者应答的时候,协调者发生超时,协调者会中断事务,协调者向所有参与者发送“abort”,变更为“aborted”状态。

    2.参与者:执行事务操作,并将undo和redo信息记录到事务日志中

    (1)执行成功,返回“ack”,变更为“pre-commit”状态。

    (2)执行失败,返回“abort”,变更为“aborted”状态。

    (3)等待协调者的“PrepareCommit”超时,返回“abort”,变更为“aborted”状态。

    (4)接收到协调者的“absort”请求,中断事务,变更为“aborted”状态。

     

    DoCommit

    1.协调者:如果所有参与者在PreCommit阶段都返回“ack”,则发送“commit”给所有参与者,协调者进入“commited”状态。

    (1)协调者收到所有参与者的“ack”应答,事务结束。

    (2)协调者等待参与者“ack”应答超时,协调者中断事务,发送“abort”给所有参与者,进入“aborted”状态。

    2.协调者:如果有参与者返回“abort”,则发送“abort”给所有参与者,中断事务,协调者进入“aborted”状态。

    3.参与者:根据协调者发出的命令进行操作

    (1)参与者收到协调者的“commit”,执行事务提交,并释放所有的资源和锁,参与者进入“commited”状态。返回“ack”。

    (2)参与者收到协调者的“abort”,根据undo日志进行回滚,并释放所有的资源和锁,参与者进入“aborted”状态,返回“ack”。

    (3)参与者为“pre-commit”状态,没有收到协调者的“commit”或“abort”,会在等待超时后,提交事务(可能出现数据一致性的问题,例如参与者没有收到的消息是“abort”)。

     

    3PC存在的问题:

    1.数据不一致:在DoCommit阶段,如果因为网络问题,协调者发出的abort没有及时被参与者接收。这时候参与者最终执行了commit,就会引发数据不一致的问题。

    2.需要更多的通讯次数,实现复杂

     

    3PC在2PC上的改动点:

    • 在协调者和参与者中都引入超时机制(处理同步阻塞、单点故障问题)。
    • 将2PC的“准备阶段”切分成:CanCommit、DoCommit。在CanCommit阶段中尽早给出事务是否可以执行的判断,减少资源占用,提高吞吐量。
    • 在DoCommit阶段,即使协调者宕机,如果参与者不是abort和commited状态,就只能是pre-commit状态,最终也会提交事务。因为当该参与者是“pre-commit”状态时,意味着所有参与者都在CanCommit阶段中应答了,很大概率是可以成功执行事务的。因为在这3个阶段任意一个阶段中,如果任意一个参与者故障、超时、不能执行事务,协调者都会发送abort给所有参与者中断事务。

    参考:

    https://developer.jboss.org/wiki/Three-phaseCommitProtocol

    https://en.wikipedia.org/wiki/Two-phase_commit_protocol

    https://en.wikipedia.org/wiki/Three-phase_commit_protocol

    http://www.hollischuang.com/archives/681

    https://www.hollischuang.com/archives/1580

    展开全文
  • 关于分布式事务的设计,我们一直在使用两阶段提交(2PC)作为标准的流程。但是有必要从本质上理解为什么需要两阶段提交。 首先我们要清楚事务的流程是什么样的,一个事务最基本的流程为:读写操作,redo/undo log...

    关于分布式事务的设计,我们一直在使用两阶段提交(2PC)作为标准的流程。但是有必要从本质上理解为什么需要两阶段提交(有兴趣的同学可以看看这篇文章http://duanple.blog.163.com/blog/static/70971767201311810939564)


    首先我们要清楚事务的流程是什么样的,一个事务最基本的流程为:读写操作,redo/undo log,写数据库表。也就是说在真正在数据库表之前,要有redo/undo log操作。在传统的分布式事务设计中,redo/undo log放在两阶段提交的第一阶段中,如果第一阶段成功,则进行第二阶段的数据库表更新。


    这里有人要问,上述过程和单机版事务有什么区别,为什么单机版事务没有两阶段提交一说。我的回答是,单机版事务也把redo/undo log操作放在提交阶段,但是其是和数据库表的更新连起来一块做了。其最本质的区别是分布式事务必须要在提交阶段分开log操作和数据库表操作,否则某一个节点成功,另一个节点失败,就会造成数据的不一致。


    上述就是两阶段提交的本质。有人说两阶段提交是为了降低网络通信危险期对系统影响。其定义的危险期(in-dout time)是指网络通信的时间,因为分布式事务每个node都需要做相应工作,如果最后提交时又要写log,又要管理lock,又要最后commit标记,事情太多。这么长的时间会使得某个节点的网络通信失败的概率加大,所以把大块的任务划分为小块,即分成了2阶段提交。通过本文的解释,可以看出这种说法是错误的。


    那么我们再进一步思考,两阶段提交带来的性能影响就是多了一轮RPC,如果我们的目标是去掉2PC或者优化2PC,本质目标就是减少RPC。如果我们能用多版本机制实现undo log,那么提交阶段如果能把redo和数据库表操作放在一起就可以省掉第一阶段提交了,但是这样不能避免出错的问题。redo log 应该放在commit之前,那么能否每次读写操作的时候也同时进行redo log操作呢?传统的做法redo log和undo log都在放在所有读写操作完成之后,commit之前进行,其目的是如果abort的话就不需要redo log,当然也不需要写表了。带来的缺陷是给分布式事务多了一轮RPC。如果我们每次读写操作都带上redo log同时写入各自版本,那么就不需要两阶段提交(省掉一轮RPC)。

    展开全文
  • 前言:X/A协议实际上也是分两阶段提交的编码实现,只是X/A协议依赖于数据库,需要数据库支持X/A协议,TCC的核心思想是"参与事务的应用程序都应该提供三个http接口,由一个事务协调者进行整体事务的协调" ...


    前言:X/A协议实际上也是分两阶段提交的编码实现,只是X/A协议依赖于数据库,需要数据库支持X/A协议,TCC的核心思想是"参与事务的应用程序都应该提供三个http接口,由一个事务协调者进行整体事务的协调"

    Try接口:预留业务资源;跟普通的操作操作差不多,只是有个status来标识为预生效;
    Confirm接口:确认执行业务操作;update status改为生效;
    Cancel接口:取消执行业务操作;如果有报错,那么多个分接口都需要需求,比如把status该为取消等

     

     

     

     


     

    展开全文
  • 分布式事务两阶段提交详解

    千次阅读 2014-07-02 11:44:15
    http://duanple.blog.163.com/blog/static/70971767201311810939564/
    http://duanple.blog.163.com/blog/static/70971767201311810939564/
    
    展开全文
  • 对分布式事务两阶段提交、三阶段提交的理解 一、分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。 1.什么是数据一致性 ...
  •   分布式事务的实现并不是很难,比如下 文要展开的两阶段提交(2PC:Two-Phrase Commit)和三阶段提交(3PC:Three-Phrase Commit)都给我们提供了思路,但是如果要保证数据的强一致性,并要求对外提供可用的服务...
  • 1.XA XA是由X/Open组织提出的分布式事务的规范。...XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁。XA之所以需要引入事
  • 事务两阶段提交

    千次阅读 2019-03-20 11:38:14
    MySQL通过两阶段提交解决了服务层binlog与引擎层Innodb的redo log的一致性与协同问题。 第一阶段:InnoDB prepare,持有prepare_commit_mutex,并写入到redo log中。将回滚段(undo)设置为Prepared状态,binlog不做...
  • 详细介绍了Mysql日志的两阶段提交分布式事务以及多事务组提交策略。
  • XA: 事务两阶段提交

    千次阅读 2016-01-26 10:53:59
    事务两阶段提交,三阶段提交协议(有限状态自动机) •1 事务的ACID   事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。   A是Atomicity,原子性。一...
  • 一、什么是分布式事务 在分布式系统中,为了保证数据的高可用,通常我们会将数据保留多个副本,同时这些副本会存储到不同的物理机器上,这就是分布式。 为了保证数据的一致性,需要用到分布式事务 1.1 什么是事务...
  • 分布式事务(一) 两阶段提交及JTA

    千次阅读 2016-08-02 06:49:20
    分布式事务与本地事务一样,包含原子性(Atomicity)、...两阶段提交是保证分布式事务中原子性的重要方法。本文重点介绍了两阶段提交的原理,PostgreSQL中两阶段提交接口,以及Java中两阶段提交接口规范JTA的使用方式。
  • 事务两阶段提交

    千次阅读 2012-12-03 17:46:20
    事务两阶段提交 1 事务的ACID 事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。 A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性...
  •   1.XA   XA是由X/Open组织提出的分布式事务的规范。XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管...
  • 随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可...本文将简单介绍如何有效的解决分布式的一致性问题,其中包括什么是分布式事务,二阶段提交和三阶段提交。 分布式
  • 两阶段提交事务

    2009-04-05 20:22:00
    2PC(Two Phase Commitment Protocol) 两阶段提交协议 实现分布式事务的关键就是两阶段提交协议。在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单独软件组件来控制。此协议中的五个步骤如下:...
  • 分布式事务中的两阶段提交

    千次阅读 2013-04-14 23:11:55
    在分布式环境中,不同节点上的数据库系统发生错误及错误恢复的操作都...这篇文章我们来谈谈广泛用于分布式事务中的两阶段提交协议,即 2PC(2 phase commit)。这里,先列出几个分布式事务常见的问题,希望大家读完这篇文
  • 假如没有分布式事务 在一系列微服务系统当中,假如不存在分布式事务,会发生什么呢?让我们以互联网中常用的交易业务为例子: 上图中包含了库存和订单个独立的微服务,每个微服务维护了自己的数据库。在...
  • flink的事务两阶段提交

    千次阅读 2020-04-14 10:31:41
    场景描述:两阶段提交(two-phase commit, 2PC)是最基础的分布式一致性协议,应用广泛。本文来介绍它的相关细节以及它在Flink中的典型应用场景。。
  • 分布式事务两阶段提交协议2PC、三阶提交协议3PC 详细介绍
  • 事务两阶段提交

    千次阅读 2015-01-25 20:41:30
    事务 事务是保证数据库从一个一致性的状态永久性地变成另一个一致性状态的根基 ACID ACID是事务基本特性: A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,...
  • 本文转发自技术世界,原文链接 分布式事务(一)两阶段提交及JTA分布式事务分布式事务简介分布式事务是指会涉及到操作多个数据库(或者提供事务语义的系统,如JMS)的事务。其实就是将对同一数据库事务的概念扩大到...
  • 事务两阶段提交,三阶段提交协议(有限状态自动机) •1 事务的ACID   事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。   A是Atomicity,原子性。一...
  • MongoDB两阶段提交实现事务

    万次阅读 2017-03-29 09:42:03
    MongoDB两阶段提交实现事务  MongoDB数据库中操作单个文档总是原子性的,然而,涉及多个文档的操作,通常被作为一个“事务”,而不是原子性的。因为文档可以是相当复杂并且包含多个嵌套文档,单文档的...
  • 两阶段提交(2PC) 是 Oracle Tuxedo 系统提出的 XA 分布式事务协议的其中一种实现方式。 一、关于 XA 分布式事务协议 XA 分布式协议主要有个角色: 事务管理器(协调者) 事务管理器作为全局事务的协调管理者,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,906
精华内容 32,362
关键字:

事务的两阶段提交