精华内容
下载资源
问答
  • 2022-01-24 16:01:20

    分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中,各个节点之间在物理上相互独 立,通过网络进行沟通和协调。

    XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件 用它来通知数据库事务的开始、结束以及提交、回滚等。 XA 接口函数由数据库厂商提供。 二阶段提交(Two-phaseCommit)是指,在计算机网络以及数据库领域内,为了使基于分布式系统 架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提 交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功 或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事 务的 ACID 特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并 最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此, 二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者 的反馈情报决定各参与者是否要提交操作还是中止操作。

    准备阶段

    事务协调者(事务管理器)给每个参与者(资源管理器)发送 Prepare 消息,每个参与者要么直接返回 失败(如权限验证失败),要么在本地执行事务,写本地的 redo 和 undo 日志,但不提交,到达一 种“万事俱备,只欠东风”的状态。

    提交阶段

    如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则, 发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过 程中使用的锁资源。(注意:必须在最后阶段释放锁资源)。

    缺点

    同步阻塞问题

    1、执行过程中,所有参与节点都是事务阻塞型的。

    单点故障

    2、由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。

    数据不一致(脑裂问题)

    3、在二阶段提交的阶段二中,当协调者向参与者发送 commit 请求之后,发生了局部网络异 常或者在发送 commit 请求过程中协调者发生了故障,导致只有一部分参与者接受到了 commit 请求。于是整个分布式系统便出现了数据部一致性的现象(脑裂现象)。

    二阶段无法解决的问题(数据状态不确定)

    4、协调者再发出 commit 消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那 么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道 事务是否被已经提交。

    更多相关内容
  • Mysql的两阶段协议

    千次阅读 2022-01-30 21:58:46
    mysql的事务为什么需要两阶段协议两阶段协议是什么?在mysql优化中如何利用两阶段锁的特性提交mysql并发量?

    问题引入

    我们都知道事务的四大特性,ACID,原子性、一致性、隔离性、持久性。那么事务是如何实现这样的特性的呢?其中原子性通过redo、undo、binlog日志来实现;持久性通过mysql底层的刷磁盘机制实现;隔离性通过MVCC多版本快照读实现;但是数据的一致性如何实现呢?通过什么样的锁机制?如何把一个事务中的多个写操作放到一个锁中呢?每个写操作的锁是如何加的?如何释放的?

    此篇博客主要是讲述MySql(仅限innodb)的两阶段加锁(2PL)协议,而非两阶段提交(2PC)协议,区别如下:

    2PL,两阶段加锁协议:指的是单机事务中的加锁机制。

    2PC,两阶段提交协议:主要用于分布式事务中,通过对每个数据库事务之间的协调来达到分布式事务效果。

    什么时候会加锁

    在 select for update、lock in share model 时,update, delete 等操作时 ,会对记录加锁(有共享锁、排它锁、意向锁、gap锁、nextkey锁等等),本文为了简单考虑,不考虑锁的种类。

    什么是两阶段加锁-2PL

    在一个事务里面,分为加锁(lock)阶段和解锁(unlock)阶段,也即所有的lock操作都在unlock操作之前,如下图所示:

     

    工程实践中的两阶段加锁-S2PL

    在实际情况下,SQL是千变万化、条数不定的,数据库很难在事务中判定什么是加锁阶段,什么是解锁阶段。于是引入了S2PL(Strict-2PL),即:

    在事务中只有提交(commit)或者回滚(rollback)时才是解锁阶段,其余时间为加锁阶段。

    如下图所示:

    这样的话,在实际的数据库中就很容易实现了。

     

    了解了两阶段加锁协议,我们可以通过这个理论进行一些优化,主要就是通过缩短加锁时间来提高Mysql的并发量。

    比如:在一个事务中,将不加锁的普通查询写在前面,将需要加锁的操作写在后面;将热点数据的加锁放在事务的最后;合并SQL等。

    1、缩短热点数据的加锁时间

    上面很好的解释了两阶段加锁,现在我们分析下其对性能的影响。考虑下面两种不同的扣减库存的方案:

    方案1:begin;
    
    // 扣减库存update t_inventory set count=count-5 where id=${id} and count >= 5;
    // 锁住用户账户表select * from t_user_account where user_id=123 for update;
    // 插入订单记录insert into t_trans;commit;
    方案2:begin;
    // 锁住用户账户表select * from t_user_account where user_id=123 for update;
    // 插入订单记录insert into t_trans;
    // 扣减库存update t_inventory set count=count-5 where id=${id} and count >= 5;commit;

    由于在同一个事务之内,这几条对数据库的操作应该是等价的。但在两阶段加锁下的性能确是有比较大的差距。两者方案的时序如下图所示:

     

    由于库存往往是最重要的热点,是整个系统的瓶颈。那么如果采用第二种方案的话, tps应该理论上能够提升3rt/rt=3倍。这还仅仅是业务就只有三条SQL的情况下,多一条sql就多一次rt,就多一倍的时间。
    
    从上面的例子中,可以看出,需要把最热点的记录, 放到事务最后,这样可以显著的提高吞吐量。更进一步: 越热点记录离事务的终点越近(无论是commit还是rollback)
    

    注意:避免死锁

    上面我们说了通过调整加锁顺序可以提高Mysql数据库并发量。但是一旦涉及到调整加锁顺序就要注意一件事情:死锁。因为死锁的形成条件就是加锁顺序不一致导致的,所以我们要统一按照调整之后的顺序进行加锁。死锁的形成条件见下图:

    2、SQL合并

    我们可以直接将一些简单的判断逻辑写到update的谓词里面,以减少加锁时间,考虑下面两种方案:

    方案1:

    begin:
        int count = select count from t_inventory for update;
        
        if count >= 5:
            update t_inventory set count = count - 5 where id = 123; 
            commit;  
        else        
           rollback;
    方案2:
    
    begin:        
        int rows = update t_inventory set count = count-5 where id = 123 and count >= 5
           
        if rows > 0:
            commit;                
        else:         
            ​​​​​​​rollback;

    时延如下图所示:


    可以看到,通过在update中加谓词计算,少了1rt的时间。

    由于update在执行过程中对符合谓词条件的记录加的是和select for update一致的排它锁

    (具体的锁类型较为复杂,不在这里描述),所以两者效果一样。

    展开全文
  • 两阶段提交协议(two phase commit protocol,2PC)可以保证数据的强一致性,许多分布式关系型数据管理系统采用此协议来完成分布式事务。它是协调所有分布式原子事务参与者,并决定提交或取消(回滚)的分布式算法。...

    一、协议概述

    两阶段提交协议(two phase commit protocol,2PC)可以保证数据的强一致性,许多分布式关系型数据管理系统采用此协议来完成分布式事务。它是协调所有分布式原子事务参与者,并决定提交或取消(回滚)的分布式算法。同时也是解决一致性问题的一致性算法。该算法能够解决很多的临时性系统故障(包括进程、网络节点、通信等故障),被广泛地使用。但是,它并不能够通过配置来解决所有的故障,在某些情况下它还需要人为的参与才能解决问题。参与者为了能够从故障中恢复,它们都使用日志来记录协议的状态,虽然使用日志降低了性能但是节点能够从故障中恢复。

    两个角色

    在两阶段提交协议中,分布式系统一般包含两类机器(或节点):

    1. 协调者 coordinator,通常一个系统中只有一个;
    2. 事务参与者 participants,cohorts 或 workers,一般包含多个;

    最终结果

    当 2PC 的最后一步完成之后,协调器执行协议,参与者根据本地事务能够成功完成回复同意提交事务或者回滚事务。

    二、执行过程

    两阶段提交协议由两个阶段组成。在正常的执行下,这两个阶段的执行过程如下所述:

    (1)阶段1:请求阶段(prepare 阶段,或称表决阶段)

    在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程。在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。

    (2)阶段2:提交阶段(commit 阶段)

    在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。参与者在接收到协调者发来的消息后将执行响应的操作。

    如果在 prepare 阶段的反馈结果为 yes,而 commit 的过程中出现宕机等异常,则在节点服务重启后,可根据 XA recover 再次进行 commit 补偿,以保证数据的一致性。
    注意: 两阶段提交协议与两阶段锁协议不同,两阶段锁协议为一致性控制协议。

    图解执行过程

    先执行请求提交,然后协调者根据参与者反馈的结果决定是提交还是回滚。下面这个图展示的是反馈结果是提交的过程。
    在这里插入图片描述

    三、协议的特点

    两阶段提交协议最大的劣势是其通过阻塞完成的协议在节点等待消息的时候处于阻塞状态,节点中其他进程则需要等待阻塞进程释放资源才能使用。如果协调器发生了故障,那么参与者将无法完成事务则一直等待下去。以下情况可能会导致节点发生永久阻塞:

    (1)如果参与者发送同意提交消息给协调者,进程将阻塞直至收到协调器的提交或回滚的消息。如果协调器发生永久故障,参与者将一直等待,这里可以采用备份的协调器,所有参与者将回复发给备份协调器,由它承担协调器的功能。

    (2)如果协调器发送“请求提交”消息给参与者,它将被阻塞直到所有参与者回复了,如果某个参与者发生永久故障,那么协调器也不会一直阻塞,因为协调器在某一时间内还未收到某参与者的消息,那么它将通知其他参与者回滚事务

    两阶段提交协议没有容错机制,一个参与者节点发生故障整个事务都要回滚,代价比较大。

    四、协议的缺点

    1. 单点故障

    虽然协调者挂了可以通过一定的选举算法选出一个新的协调者来,但是处于第二个阶段的参与者会锁定资源,导致别人使用这个资源的话会被阻塞。即使你重新换了一个协调者,那参与者还是阻塞的,这怎么解决?

    2. 同步阻塞

    2PC 中的参与者是阻塞式的。在第一阶段收到请求后就会预先锁定资源,一直到 commit 后才会释放。

    3. 数据不一致

    2PC 第二阶段 commit 时如果协调者挂掉,就会出现部分参与者收到了 commit 请求、部分参与者没有收到 commit 请求,从而导致数据不一致的情况。比如这种场景:协调者 A,参与者 B,C,D。假设已经执行到了 2PC 的第二阶段,A 已经给 B 发送了 commit 请求,但是此时 A 挂掉了,那 C、D 就收不到请求了,这个时候 B 的数据是新的,C、D 还是旧的。

    解决方案:协调者宕机,那我们需要使用协调者备份,该协调者备份启动后,通过日志找到未完成的事务,对各参与者发起询问

    五、总结

    基于 2PC 存在的问题,后来有人提出了三阶段提交协议,在其中引入超时的机制,将阶段 1 分解为两个阶段:在超时发生以前,系统处于不确定阶段;在超市发生以后,系统则转入确定阶段。

    2PC 协议包含协调者和参与者,并且二者都有发生问题的可能性。 假如协调者发生问题,我们可以选出另一个协调者来提交事务。例如,班长组织活动,如果班长生病了,我们可以请副班长来组织。如果协调者出问题,那么事务将不会取消。例如,班级活动希望每个人都能去,假如有一位同学不能去了,那么直接取消活动即可。或者,如果大多数人去的话那么活动如期举行(2PC变种)。为了能够更好地解决实际的问题,2PC协议存在很多的变种,例如:树形2PC协议 (或称递归2PC协议)、动态2阶段提交协议(D2PC)等。

    展开全文
  • 分布式系统中的两阶段提交协议

    千次阅读 2020-04-20 22:35:28
    分布式系统中的两阶段提交协议 在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调...

    分布式系统中的两阶段提交协议

    在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。

    因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

    主要用来解决临时性系统故障(进程、网络节点、通信等故障)带来的数据不一致性问题

    系统一般包含两类机器(或节点、角色):协议者参与者

    协议中假设每个节点都会记录写前日志(write-ahead log),并持久性存储,即使发生故障,日志也不会丢失。

    协议同时假设节点不会发生永久性故障,而且任意两个节点之间都可以通信。

    当事务最后一步完成之后,协调者执行协议,参与者根据本地事务是否成功完成,向协调者回复同意提交事务或回滚事务。

    两个阶段:

    阶段1:请求阶段(Commit-Request Phase)

    (1)协调者通知所有事务参与者提交或回滚事务,并开始等待各参与者的反馈信息。

    (2)参与者执行所有事务操作,并将Undo信息和Redo信息写入日志。

    (3)各参与者告知协调者自己的决策:同意提交事务(事务参与者本地作业执行成功)或回滚事务(本地作业执行故障)。

    阶段2:提交阶段(Commit Phase)

    协调者将第一个阶段的投票结果进行决策:提交或回滚。当且仅当所有参与者同意提交,协调者才通知所有参与者提交事务。

    参与者收到协调者发来的消息后执行相应的操作。

    协调者如果发现有一个投票是Vote-Abort,那么将创建一个Global-Abort通知所有参与者终止该事务。

    如果都是Vote-Commit,那么协调者将发生Global-Commit,告知所有参与者执行该事务。

      

    两阶段协议执行过程中,所有参与者都是事务阻塞的。

    展开全文
  • 文章目录问题协调者统一调度二阶段提交协议 问题 在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。 在关系型数据库中,由于存在事务机制,可以保证每个独立节点上的数据操作满足 ACID。 ...
  • 阶段提交协议在协调者和参与者中都引入超时机制,并且把两阶段提交协议的第一个阶段拆分成了步:询问,然后再锁资源,最后真正提交。 (1)三个阶段的执行 1.CanCommit阶段 3PC的CanCommit阶段其实和2PC的准备...
  • 两阶段封锁协议

    千次阅读 2019-07-23 23:55:02
    段锁协议是指每个事务的执行分为阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)。 加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。...
  • 根据两阶段协议,不论怎么安排语句,所有的操作需要的行锁都是在事务提交的时候才释放的,要想使行锁在事务中不会停留太长时间,最大程度的减少了事务之间的锁等待,应该把语句 2 放在最后面。如下图所示: 死锁 如...
  • 分布式系统理论之两阶段提交协议

    千次阅读 2019-06-20 19:46:32
    一,两阶段提交协议介绍 两阶段提交协议是用来保证分布式系统事务的协议。在分布式系统中,一个事务需要由多台机器协调完成,机器之间通过网络来通信,如何保证一组操作在多台机器上要么都做,要么都不做呢?(事务...
  • XA协议两阶段提交(原理)

    千次阅读 2021-06-15 14:46:14
    基于XA协议两阶段提交 XA是由X/Open组织提出的分布式事务的规范 由一个事务管理器(TM)和多个资源管理器(RM)组成 提交分为阶段:prepare和commit 第一阶段 第二阶段 保证数据的强一致性 commit阶段...
  • 两阶段提交协议的异常处理

    千次阅读 2014-07-07 12:54:08
    两阶段提交的协议大家都比较熟悉了,解释一下每个阶段的异常处理。
  • 来源:  ...分布式协议两阶段提交协议(2PC)和改进三阶段提交协议(3PC) 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 两阶段提交协议与三阶段提交协议
  • 段锁协议

    千次阅读 2021-11-03 22:25:54
    段锁协议:是指所有的事务必须分阶段对数据项加锁和解锁。即事务分阶段,第一个阶段是获得封锁。事务可以获得任何数据项上的任何类型的锁,但是不能释放;第二阶段是释放封锁,事务可以释放任何数据项上的...
  • 什么是两阶段提交协议

    千次阅读 2009-04-07 15:33:00
    两阶段提交协议实现分布式事务的关键就是两阶段提交协议。在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单独软件组件来控制。此协议中的五个步骤如下:• 应用程序调用事务协调器中的提交方法。...
  • 对分布式事务及两阶段提交、三阶段提交的理解 一、分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。 1.什么是数据一致性 ...
  • MySql-两阶段加锁协议

    千次阅读 多人点赞 2017-08-07 18:13:05
    此篇博客主要是讲述MySql(仅限innodb)的两阶段加锁(2PL)协议,而非两阶段提交(2PC)协议,区别如下: 2PL,两阶段加锁协议:主要用于单机事务中的一致性与隔离性。 2PC,两阶段提交协议:主要用于分布式事务。 MySql...
  • 分布式协议两阶段提交协议(2PC)和改进三阶段提交协议(3PC) 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 两阶段提交协议与三阶段提交协议
  • 分布式事务中的两阶段、三阶段提交协议 参考链接:http://www.hollischuang.com/archives/681 随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就...
  • 两阶段提交协议与三阶段提交协议

    千次阅读 2016-06-07 10:17:29
    在分布式系统中通常存在着多个机器节点,每个节点只能控制自己事务的成功与失败而无法获知... 在分布式系统中通常存在个问题,可用性、数据一致性,通常我们会在可用性与数据一致性之间做一个衡量,在这需求中就产
  • 两阶段提交协议(two phase commit protocol,2PC)可以保证数据的强一致性,许多分布式关系型数据管理系统采用此协议来完成分布式事务。它是协调所有分布式原子事务参与者,并决定提交或取消(回滚)的分布式算法。...
  • 2PC即两阶段提交协议,是将整个事务流程分为阶段,准备阶段(Prepare phase)、提交阶段(commit phase). 2是指阶段,P是指准备阶段,C是指提交阶段。 举例:张三和李四好久不见,老友约起聚餐,饭店老板...
  • 0.概述 ...因此,在这篇博文中,我们提出了一个两阶段提交协议,可用于模拟多文档事务。 2.概述 Elasticsearch 中的创建、更新和删除操作在文档级别是原子的,这意味着创建、修改或删除单个文档要么完
  • 分布式存储的三阶段提交协议

    千次阅读 2020-04-20 22:37:10
    阶段提交是为解决两阶段提交协议的缺点而设计的。与两阶段提交不同的是,三阶段提交是“非阻塞”协议。三阶段提交在两阶段提交的第一阶段与第二阶段之间插入了一个准备阶段,使得原先在两阶段提交中,参与者在投票...
  • 三级封锁协议用于解决修改丢失、不可重复读和读脏数据问题,解决问题的焦点是给数据库对象何时加锁、加什么样的锁 一级封锁协议:事务T在修改数据R之前必须对其加X锁,解决修改丢失问题 二级封锁协议:在一级封锁...
  • HTTP协议的发展阶段

    千次阅读 2022-03-31 16:38:48
    HTTP(HyperText Transfer Protocol,超文本传输协议)是访问万维网使用的核心通信协议,也是今天所有Web应用程序使用的通信协议。它是为Web浏览器与Web服务器之间的通信而设计的,HTTP协议到目前为止全部的版本可以...
  • 两阶段提交(Two-Phase Commit)

    千次阅读 2019-10-22 18:40:14
    两阶段提交是一种同步协议,是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中保持原子性和一致性而设计的一种算法。 两阶段提交的执行过程 在两阶段提交过程中,主要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 311,806
精华内容 124,722
关键字:

两阶段协议