分布式事务(1)-理论基础

分布式事务(2)---强一致性分布式事务解决方案

分布式事务(3)---强一致性分布式事务Atomikos实战

强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻保持一致,在高并发场景下,系统的性能可能收到影响。而最终一致性方案并不要求数据时刻一致,允许其存在中间状态,只要一段时间后数据能够最终一致即可。

所以基于BASE理论,提出了最终一致性解决方案,典型的有:TCC解决方案,可靠消息最终一致性方案,最大努力通知型解决方案。

其优点是:

1.性能比较高,不会因为长时间持有事务占用资源。

2.具备可用性。

3.适合高并发场景。

缺点是,因为数据的短暂不一致,所以会出现某一时刻数据的不一致。

对于一致性特别高的场景不适用。

我们实现最终一致性方案时,需要注意几个操作:

可查询操作:业务方需要提供可查询接口,来查询数据信息和状态,供其他服务知道数据状态。

幂等操作:同样的参数执行同一个方法,返回的结果都一样。在分布式环境,难免会出现数据的不一致,很多时候为了保证数据的一致,我们都会进行重试。如果不保证幂等,即使重试成功了,也无法保证数据的一致性。我们可以通过业务本身实现实现幂等,比如数据库的唯一索引来约束;也可以缓存(记录)请求和操作结果,当检测到一样的请求时,返回之前的结果。

补偿操作:某些数据存在不正常的状态,需要通过额外的方式使数据达到最终一致性的操作。

TCC

TCC解决方案主要包括三个阶段:try---尝试业务执行,confirm---确定业务执行,cancel---取消业务执行

try阶段完成所有业务的一致性检查,预留必要的业务资源。

confirm阶段,真正执行业务,因为try已经执行了资源预留,所以此阶段不会再检查数据,此阶段的操作需要满足幂等。

cancel阶段,释放try预留的业务资源,此阶段也需要满足幂等。

TCC主要用于跨服务调用下分布式事务问题,适用于具有强隔离性,又严格要求一致性的业务场景。

举个栗子

还是用下单扣库存为例

try阶段:创建订单,并将订单状态设置为待提交,调用库存服务预扣减库存。库存表中库存字段减去订单中的数量,同事在预扣减字段中增加订单中库存数量。以此来预留资源

confirm阶段:如果try全部成功,则进入confirm阶段。此阶段将订单状态修改为已提交,库存服务则将预扣减库存字段的数量减去订单中的数量,实现真正的减库存。

通常TCC方案我们都认为confirm阶段是不会出错的。就是说只要try成功了,那么confirm就一定会成功。如果confirm出错了,那么就需要引入补偿机制或者人工处理。

cancel阶段:try阶段失败或者出现异常,至此那个cancel,订单状态修改为已取消,库存服务将表中库存字段增加订单中的数量,预扣减字段减去订单中的数量,以此实现事务回滚。同样TCC中我们认为cancel阶段一定会执行成功,如果失败也需要引入重试或者人工处理。

TCC方案中锁定资源的粒度小,有利于提高系统性能;confirm和cancel阶段的幂等保证分布式事务执行完成后数据的一致性。由主业务放发起事务,无论是主业务还是分支业务都能集群部署,解决了XA规范的单点故障问题。但是它的代码需要耦合到业务中,参与分布式事务的每个业务方法都需要try,confirm,cancel阶段,增加开发成本。

TCC中需要注意的问题

1.空回滚

当一个分支事务所在的服务发生宕机或者网络异常导致调用失败,并未执行try方法,当恢复后事务执行回滚操作就会调用此分支事务的cancel方法,如果cancel方法不能处理此种情况就会出现空回滚。

是否出现空回滚,我们需要需要判断是否执行了try方法,如果执行了就没有空回滚。解决方法就是当主业务发起事务时,生成一个全局事务记录,并生成一个全局唯一ID,贯穿整个事务,再创建一张分支事务记录表,用于记录分支事务,try执行时将全局事务ID和分支事务ID存入分支事务表中,表示执行了try阶段,当cancel执行时,先判断表中是否有该全局事务ID的数据,如果有则回滚,否则不做任何操作。比如seata的AT模式中就有分支事务表。

2.幂等问题

由于服务宕机或者网络问题,方法的调用可能出现超时,为了保证事务正常执行我们往往会加入重试的机制,因此就需要保证confirm和cancel阶段操作的幂等性。

我们可以在分支事务记录表中增加事务执行状态,每次执行confirm和cancel方法时都查询该事务的执行状态,以此判断事务的幂等性。

3.悬挂问题

TCC中,在调用try之前会先注册分支事务,注册分支事务之后,调用出现超时,此时try请求还未到达对应的服务,因为调用超时了,所以会执行cancel调用,此时cancel已经执行完了,然而这个时候try请求到达了,这个时候执行了try之后就没有后续的操作了,就会导致资源挂起,无法释放。

执行try方法时我们可以判断confirm或者cancel方法是否执行,如果执行了那么就不执行try阶段。同样借助分支事务表中事务的执行状态。如果已经执行了confirm或者cancel那么try就执行。

分布式事务(4)---最终一致性方案之TCC的更多相关文章

  1. 使用MQ来保证分布式事务的最终一致性

    前言 之前我们讨论了如何拆分一个订单下单的一个服务(https://www.cnblogs.com/linkstar/p/9610268.html) 从单体到微服务的拆分,当时我们只是对原来的整个服务 ...

  2. 分布式事务之最终一致性BASE理论

    一.事务 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚.简单地说 ...

  3. 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病!

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...

  4. 使用kafka消息队列解决分布式事务(可靠消息最终一致性方案-本地消息服务)

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 本文转自:http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一 ...

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

    1.2PC协议 2PC 是二阶段提交(Two-phase Commit)的缩写,顾名思义,这个协议分两阶段完成.第一个阶段是准备阶段,第二个阶段是提交阶段,准备阶段和提交阶段都是由事务管理器(协调者) ...

  6. 分布式事务(3)---强一致性分布式事务Atomikos实战

    分布式事务(1)-理论基础 分布式事务(2)---强一致性分布式事务解决方案 分布式事务(4)---最终一致性方案之TCC 前面介绍强一致性分布式解决方案,这里用Atomikos框架写一个实战的dem ...

  7. 关于分布式事务,XA协议的学习笔记

    XA分布式事务协议,包含二阶段提交(2PC),三阶段提交(3PC)两种实现. 1.二阶段提交方案:强一致性 事务的发起者称协调者,事务的执行者称参与者. 处理流程: 1.准备阶段 事务协调者,向所有事 ...

  8. 阿里神器 Seata 实现 TCC模式 解决分布式事务,真香!

    今天这篇文章介绍一下Seata如何实现TCC事务模式,文章目录如下: 什么是TCC模式? TCC(Try Confirm Cancel)方案是一种应用层面侵入业务的两阶段提交.是目前最火的一种柔性事务 ...

  9. 分布式事务(2)---TCC理论

    分布式事务(2)---TCC理论 上篇讲过有关2PC和3PC理论知识,博客:分布式事务(1)---2PC和3PC理论 我的理解:2PC.3PC还有TCC都蛮相似的.3PC大致是把2PC的第一阶段拆分成 ...

随机推荐

  1. CCD摄像头视场角计算公式

    视场角大小和CCD传感器尺寸和镜头焦距有关: 水平视场角 = 2 × arctan(w / 2f); 垂直视场角 = 2 × arctan(h / 2f); 视场角 = 2 × arctan(d / ...

  2. PWN学习之整数溢出

    目录 PWN学习之整数溢出 整数溢出 溢出和回绕 漏洞多发函数 整数溢出例子 PWN学习之整数溢出 整数溢出 如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险.通常情况下, ...

  3. js实现日期格式化封装--八种

    封装一个momentTime.js文件,包含8种格式. 需要传两个参数: 时间戳:stamp 格式化的类型:type, 日期补零的方法用到es6语法中的padStart(length,'字符'): 第 ...

  4. pycharm基本使用python的注释语法

    pychram基本使用 1.主题选择 file settings Editor color Scheme 2.pycharm切换解释器 file settings Project Python Int ...

  5. 13.G1垃圾收集器

    G1收集器是一款面向服务器的垃圾收集器,也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.为什么对G1收集器给予如此高的期望呢?既然对G1收集器寄予了如此高的期望,那么他一定是有其 ...

  6. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  7. Solon & Solon Cloud 1.5.62 发布,轻量级 Java 基础开发框架

    Solon 已有120个生态扩展插件,此次更新主要为细节打磨,且对k8s和docker-compose更友好: 1.插件 solon.coud ,事件总线增加支持本地同主题多订阅模式(以支持同服务内, ...

  8. docker file 笔记

    FROM    # FROM scratch,  FROM centos, FROM ubuntu:latest LABEL RUN  # 每运行一次RUN,image都会生成新的一层,为了美观,避免 ...

  9. super和this

    super注意点: 1.super调用父类的构造方法,必须在构造方法的第一个 2.super必须只能出现在子类的方法或者构造方法中 3.super和this不能同时调用构造方法 this: 代表的对象 ...

  10. CrawlSpider_获取图片名称地址,及入库

    1.继承自scrapy.Spider 2.独门秘笈 CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求 所以,如果有需要跟进链接的 ...