分布式事务的2PC、3PC和TCC

1、2PC协议

  2PC 是二阶段提交(Two-phase Commit)的缩写,顾名思义,这个协议分两阶段完成。第一个阶段是准备阶段,第二个阶段是提交阶段,准备阶段和提交阶段都是由事务管理器(协调者)发起的,协调的对象是资源管理器(参与者)。二阶段提交协议的概念来自 X/Open 组织提出的分布式事务的规范 XA 协议,协议主要定义了(全局)事务管理器和(局部)资源管理器之间的接口。XA 接口是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁。Java 平台上的事务规范 JTA(Java Transaction API)提供了对 XA 事务的支持,它要求所有需要被分布式事务管理的资源(由不同厂商实现)都必须实现规定接口(XAResource 中的 prepare、commit 和 rollback 等)。

  两阶段如下:

准备阶段

  协调者向参与者发起指令,参与者评估自己的状态,如果参与者评估指令可以完成,参与者会写 redo 和 undo 日志,然后锁定资源,执行操作,但是并不提交。

提交阶段

  如果每个参与者明确返回准备成功,也就是预留资源和执行操作成功,协调者向参与者发起提交指令,参与者提交资源变更的事务,释放锁定的资源;如果任何一个参与者明确返回准备失败,也就是预留资源或者执行操作失败,协调者向参与者发起中止指令,参与者取消已经变更的事务,执行 undo 日志,释放锁定的资源。

  我们看到两阶段提交协议在准备阶段锁定资源,是一个重量级的操作,并能保证强一致性,但是实现起来复杂、成本较高,不够灵活,更重要的是它有如下致命的问题:

阻塞

  对于任何一次指令必须收到明确的响应,才会继续做下一步,否则处于阻塞状态,占用的资源被一直锁定,不会被释放。

脑裂

  协调者发送提交指令,有的参与者接收到执行了事务,有的参与者没有接收到事务,就没有执行事务,多个参与者之间是不一致的。

单点故障

  如果协调者宕机,参与者没有了协调者指挥,会一直阻塞,尽管可以通过选举新的协调者替代原有协调者,但是如果之前协调者在发送一个提交指令后宕机,而提交指令仅仅被一个参与者接受,并且参与者接收后也宕机,新上任的协调者无法处理这种情况。

2、3PC协议

  三阶段提交协议(3PC 协议)是两阶段提交协议的改进版本。它通过超时机制解决了阻塞的问题,避免了资源被无限锁定的情况。但也增加了系统的复杂度,增加了参与者和协调者之间的通信次数。并且把两个阶段增加为三个阶段:

①询问阶段

  协调者询问参与者是否可以完成指令,协调者只需要回答是还是不是,而不需要做真正的操作,这个阶段参与者在等待超时后会自动中止。

②准备阶段

  如果在询问阶段所有的参与者都返回可以执行操作,协调者向参与者发送预执行请求,然后参与者写 redo 和 undo 日志,锁定资源,执行操作,但是不提交操作;如果在询问阶段任何参与者返回不能执行操作的结果,则协调者向参与者发送中止请求,这里的逻辑与两阶段提交协议的的准备阶段是相似的,这个阶段参与者在等待超时后会自动提交。

③提交阶段

  如果每个参与者在准备阶段返回准备成功,也就是预留资源和执行操作成功,协调者向参与者发起提交指令,参与者提交资源变更的事务,释放锁定的资源;如果任何一个参与者返回准备失败,也就是预留资源或者执行操作失败,协调者向参与者发起中止指令,参与者取消已经变更的事务,执行 undo 日志,释放锁定的资源,这里的逻辑与两阶段提交协议的提交阶段一致。

  这里与两阶段提交协议有两个主要的不同:

增加询问阶段

  确保尽可能早的发现无法执行操作而需要中止的行为,但是它并不能发现所有的这种行为,只会减少这种情况的发生。

等待超时处理

  如果在询问阶段等待超时,则自动中止;如果在准备阶段之后等待超时,则自动提交。这也是根据概率统计上的正确性最大。

3、TCC协议

  TCC 协议将事务的提交过程分为 try-confirm-cancel (实际上 TCC 就是 try、confirm、cancel 的简称) 三个阶段:

try

  完成业务检查、预留业务资源

confirm

  使用预留的资源执行业务操作(需要保证幂等性)

cancel

  取消执行业务操作,释放预留的资源(需要保证幂等性)

  流程如下:

  ①事务发起方向事务协调器发起事务请求,事务协调器调用所有事务参与者的 try 方法完成资源的预留,这时候并没有真正执行业务,而是为后面具体要执行的业务预留资源,这里完成了一阶段。

  ②如果事务协调器发现有参与者的 try 方法预留资源时候发现资源不够,则调用参与方的 cancel 方法回滚预留的资源,需要注意 cancel 方法需要实现业务幂等,因为有可能调用失败(比如网络原因参与者接受到了请求,但是由于网络原因事务协调器没有接受到回执)会重试。

  ③如果事务协调器发现所有参与者的 try 方法返回都 OK,则事务协调器调用所有参与者的 confirm 方法,不做资源检查,直接进行具体的业务操作。

  ④如果协调器发现所有参与者的 confirm 方法都 OK 了,则分布式事务结束。

  ⑤如果协调器发现有些参与者的 confirm 方法失败了,或者由于网络原因没有收到回执,则协调器会进行重试。如果重试一定次数后还是失败,则进行事务补偿。

原文链接:分布式事务——2PC、3PC 和 TCC

原文地址:https://www.cnblogs.com/ybxxszl/p/11758894.html

时间: 2024-10-09 18:41:24

分布式事务的2PC、3PC和TCC的相关文章

分布式事务(1)---2PC和3PC理论

分布式事务(1)---2PC和3PC理论 分布式事物基本理论:基本遵循CPA理论,采用柔性事物特征,软状态或者最终一致性特点保证分布式事物一致性问题. 分布式事物常见解决方案: 2PC两段提交协议 3PC三段提交协议(弥补两端提交协议缺点) TCC或者GTS(阿里) 消息中间件最终一致性 使用LCN解决分布式事物,理念"LCN并不生产事务,LCN只是本地事务的搬运工". 一.两阶段提交(2PC) 两阶段提交又称2PC,2PC是一个非常经典的强一致.中心化的原子提交协议. 这里所说的中心

[转帖]如何选择分布式事务形态(Fescar、TCC、SAGA、补偿、基于消息的最终一致

如何选择分布式事务形态(Fescar.TCC.SAGA.补偿.基于消息的最终一致 https://blog.csdn.net/zhangjunli/article/details/100015236 各种形态的分布式事务分布式事务有多种主流形态,包括: 基于消息实现的分布式事务基于补偿实现的分布式事务基于TCC实现的分布式事务基于SAGA实现的分布式事务基于2PC实现的分布式事务这些形态的原理已经在很多文章中进行了剖析,用“分布式事务”关键字就能搜到对应的文章,本文不再赘述这些形态的原理,并将重

【分布式事务】ACID/BASE/CAP + TCC/2PC/Soga/....

事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚.简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制. 数据库本地事务 ACID 数据库事务中的四大特性 A:原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误

分布式事务(第04篇)分布式事务解决方法-3PC

一 什么三阶段提交协议(3PC) 3PC是2PC的改进版本.主要有以下改进: 增加了一个询问阶段,询问阶段可以确保尽可能早的发现无法执行操作而需要中止的行为,但是它并不能发现所有的这种行为,只会减少这种情况的发生. 增加了等待超时的处理逻辑,如果在询问阶段等待超时,则自动中止:如果在准备阶段之后等待超时,则自动提交.这也是根据概率统计上的正确性最大. 二 3PC工作流程 询问阶段:协调者询问参与者是否可以完成指令,协调者只需要回答是还是不是,而不需要做真正的操作,这个阶段参与者在等待超时后会自动

分布式事务之深入理解什么是2PC、3PC及TCC协议?

导读 在上一篇文章<[分布式事务]基于RocketMQ搭建生产级消息集群?>中给大家介绍了基于RocketMQ如何搭建生产级消息集群.因为本系列文章最终的目的是介绍基于RocketMQ的事物消息来解决分布式系统中的数据一致性问题,所以先给大家率先介绍了RocketMQ消息集群的搭建. 原本是想着在这篇文章中直接介绍RocketMQ的事务消息特性,但是在梳理的过程中作者发现对于分布式事务的概念,可能还会有很多同学不理解或者理解得不是很深刻的地方,而跳过这些基本概念直接去学习上层的实践可能并不是一

终于有人把“TCC分布式事务”实现原理讲明白了!

之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务. 首先说一下,这里可能会牵扯到一些 Spring Cloud 的原理,如果有不太清楚的同学,可以参考之前的文章:<拜托,面试请不要再问我Spring Cloud底层原理!>. 业务场景介绍 咱们先来看看业务场景,假设你现在有一个电

如何实现一个TCC分布式事务框架的一点思考

一个TCC事务框架需要解决的当然是分布式事务的管理.关于TCC事务机制的介绍,可以参考TCC事务机制简介.http://www.bytesoft.org/tcc-intro TCC事务模型虽然说起来简单,然而要基于TCC实现一个通用的分布式事务框架,却比它看上去要复杂的多,不只是简单的调用一下Confirm/Cancel业务就可以了的. 本文将以Spring容器为例,试图分析一下,实现一个通用的TCC分布式事务框架需要注意的一些问题. 一.TCC全局事务必须基于RM本地事务来实现全局事务 TCC

TCC分布式事务

转: https://www.cnblogs.com/jajian/p/10014145.html 终于有人把“TCC分布式事务”实现原理讲明白了! - JaJian - 博客园 之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务. 首先说一下,这里可能会牵扯到一些 Spring C

分布式事务资料

分布式事务之TCC服务设计和实现注意事项 事务自动补偿方案 这个需求我不接之事务自动补偿 蚂蚁金服黑科技:SOFA DTX分布式事务,保障亿级资金操作一致性 分布式事务:蚂蚁金服核心金融场景下的演进 分布式系统的事务处理 分布式事务 ( DTS ) 你必须知道的事儿 https://www.cloud.alipay.com/products/DTX 为你解读 SOFA-DTX 分布式事务的设计演进路线 FMT模式 FMT 模式参与者 参与者接入模式 XA强一致性读写 XA事务的隔离级别算什么级别