分布式事务(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. Spring MVC:DispatchServlet类

    Spring MVC架构 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中.传统的模型层被拆分为了业务层(Service)和数据访问层 ...

  2. 身份证归属地查询免费api接口

    描写叙述 :依据身份证编号 查询归属地信息. 调用地址: http://api.k780.com:88/? app=idcard.get&idcard=510103195309280011&a ...

  3. linux c语言 rename的用法-rename() does not work across different mount points, even if the same file system is mounted on both

    最近在一个项目上执行文件的搬移功能时发现总是失败,临时录像文件存放于emmc的/tmp/目录下,当录像完成时候则调用rename企图将此文件搬到/mnt/sdcard/mmcblk1p1/(这是外置的 ...

  4. Python matplotlib pylab 画张图

    from pylab import * w1 = 1 w2 = 25 fs = 18 y = np.arange(-2,2,0.001) x = w1*y*log(y)-1.0/w2*exp(-(w2 ...

  5. Bzoj通过5题纪念

    我A了五题啦!!!

  6. DeWeb部署

    DeWeb部署 部署时需要runtime中的大部分文件 需要的目录有: apps,仅包括需要部署的dll即可 dist,必须.请勿改动 media,非必须,一般媒体文件存在于此目录 upload,必须 ...

  7. SpringBoot 整合thymeleaf

    1.Thymeleaf介绍(官网推荐:https://www.thymeleaf.org/doc/articles/thymeleaf3migration.html) Thymeleaf是跟Veloc ...

  8. Linux常用命令和快捷键整理:(1)常用命令

    前言: Linux常用快捷键和基本命令整理,先上思维导图: 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限) ...

  9. 数组 & 对象 & 函数

    数组 数组也是一个对象,不同的是对象用字符串作为属性名,而数组用数字作为索引,数组的索引从0开始 创建数组: //方式一:构造器,可以在创建数组时指定 Var arr = new Array(1,2, ...

  10. mybatis替换成mybatisplus后报错mybatisplus Invalid bound statement (not found):

    项目原来是mybatis,之后由于生成代码不方便,觉得替换成mybatisplus,引入mybatisplus后,启动项目报错mybatisplus Invalid bound statement ( ...