分布式事务(四)——TCC补偿模式解决方案

系列目录:

  • 《分布式事务(一)—— 事务的基本概念》

  • 《分布式事务(二)—— CAP和Base理论》

  • 《分布式事务(三)—— 两阶段提交解决方案(2PC)》

一、常见分布式事务解决方案

  • 两阶段提交(2PC,Two-phase Commit)
  • TCC补偿模式
  • 基于本地消息表实现最终一致性
  • 基于可靠消息最终一致方案
  • 最大努力通知

二、TCC补偿模式解决方案

  TCC是(Try Confirm Cancel)的缩写,每个单词代表了事务处理的不同阶段。其主要的思想是放弃了数据库事务的commit和rollback的方法,转而用状态的逻辑来区分不同的阶段,简单来说,就是把原来的一个业务处理的方法,拆分成三个方法,即try、confirm、和concel三个方法,在实际调用的过程中,首先调用try方法,看各个业务能否执行成功,如果都能成功,那就用confirm来确定,如果不能成功,就用cancel来取消。
  看上去,Tcc好像和2PC有点像,但是在本质上有很大的区别,2PC是利用数据库事务来实现的,而TCC是利用数据的中间状态来实现的,比如在库存扣减的业务中,在数据库设计的时候,一般会增加一个freeze字段来区分商品的冻结的库存,在try的过程中,只是将freeze的数值增加,将库存冻结,在confirm的过程中,才会真正的降低库存,在cancel中会将冻结的数值返回去。达到数据的一致性。总体来说,TCC在业务数据上做状态的标志,没有使用数据库的事务,和2PC有本质的区别。

TCC的设计图如下:
在这里插入图片描述

1、落地TCC事务的不同阶段:Try - Confirm - Cancel

  • TCC事务的实现阶段一:Try
    在这个阶段中,主业务流程处理后,会调用从业务流程的Try方法来执行相关的业务,将数据执行到中间状态。

  • TCC事务的实现阶段二:Confirm
    所有的业务都ok的话,调用Confirm方法确认事务。

  • TCC事务的实现阶段三:Cancel
    如果有服务执行没有成功,则调用Cancel来取消

2、TCC事务的使用总结

    1. 首先需要选择某种TCC分布式事务框架,各个服务力就会有这个TCC分布式事务框架在运行
    1. 然后你原本的一个接口,需要改造成3个逻辑: Try-Confirm-Cancel
    • 先是服务调用链路依次执行Try逻辑
    • 如果都正常的话,TCC分布式事务框架推进执行Confirm逻辑,完成整个事务
    • 如果某个服务的Try逻辑有问题,TCC分布式事务框架感知到之后会推进执行各个服务的Cancel逻辑,插销之前执行的各个操作

TCC分布式事务的核心思想,就是在遇到服务器宕机,依赖的资源不可用的情况下,利用一下的操作来保证事务的最终一致性:

  • 先来Try一下,不要把业务逻辑完成,先试试,看各个服务能不能正常运转,能不能先冻结需要的资源。
  • 如果Try都ok,也就是说,底层的依赖的资源都ok,那就执行Confirm逻辑,真正的实现业务。
  • 如果Try失败了,就调用Cancel逻辑来回滚。

3、TCC事务遇到意外情况的终极解决方案

  如果遇到一些意外的情况,比如服务突然宕机,TCC事务框架如何才能保证之前没有执行完的分布式事务继续执行呢?
其解决方法如下:

  • TCC事务框架都要记录一些分布式事务的活动日志,可以在磁盘上的日志文件里面记录,也可以在数据库里面记录,保存下来分布式事务运行的各个阶段的状态。
  • 万一某个服务的Cancel或者Confirm逻辑执行一直失败,TCC事务框架会通过活动日志记录各个服务的状态,然后通过重试的方法,来实现最终的执行成功,如果多次以后还是没有,可以采取发邮件等方式来通知人员处理。
  • 常用的TCC框架,seata、go-seata

4、TCC的优缺点

优点

  • 解决了跨服务的业务操作原子性问题,例如组合支付,订单扣减库存等场景
  • TCC的本质原理是把数据库的二阶段提交上升到微服务来实现,从而避免了数据库锁冲突的问题。
  • TCC异步性能高,它采用了try先检查,然后异步实现confirm,真正提交的是在confirm方法中,可以实现最终一致。

缺点

  • 对微服务的侵入性强,微服务的每个事物都必须实现Try,Confirm,Cancel等3个方法,开发成本高,后期维护改造的成本也高
  • 为了达到事务的一致性要求,try,confirm,cancel接口必须实现幂等性操作。
  • 由于事务管理器要记录事务日志,必定会消耗一定的性能,并使的整个TCC事务时间拉长,建议采取redis来记录日志。

后记
  个人总结,欢迎转载、评论、批评指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android selinux调试(rk3588 android 12平台)

Android selinux调试(rk3588 android 12平台): 参考文档: Android系统10 RK3399 init进程启动(二十七) Selinux Type和Attribute https://www.jb51.net/article/277418.htm Android selinux策略文件的编译与加载 https://c.biancheng.net/view/1151.h…

WPF DataTemplate内重写BorderBrush,VisualBrush内数据源绑定提示绑定失败

定义DataTemplate 数据模板文件&#xff0c;内容如下 <DataTemplate x:Key"{DataTemplateKey {x:Type VM:TemplateListVM}}" DataType"{x:Type VM:TemplateListVM}"> <Grid Margin"0" Grid.Row"3" Height"50" Ver…

python:lxml 生成思维导图 Freemind(.mm)文件

请参阅&#xff1a;从PDF中提取目录 或者 java : pdfbox 读取 PDF文件内书签 pip install lxml ; lxml-5.1.0-cp310-cp310-win_amd64.whl (3.9 MB) 读目录.txt文件&#xff0c;使用 lxml 生成思维导图 Freemind&#xff08;.mm&#xff09;文件 编写 txt_etree_mm.py 如下…

QML自定义ComboBox组件,支持动态筛选

QtQuick.Controls提供了ComboBox组件&#xff0c;该组件能够满足日常的下拉选择框的需求&#xff0c;但当需要用户在ComboBox中通过输入关键字进行自动匹配时&#xff0c;原生的组件虽然提供了editable属性用于输入关键字&#xff0c;但是匹配内容不弹出下拉框&#xff0c;无法…

03、全文检索 -- Solr -- Solr 身份验证配置(给 Solr 启动身份验证、添加用户、删除用户)

目录 全文检索 -- Solr -- Solr 身份验证配置启用身份验证&#xff1a;添加用户&#xff1a;删除用户&#xff1a; 全文检索 – Solr – Solr 身份验证配置 学习之前需要先启动 Solr 执行如下命令即可启动Solr&#xff1a; solr start -p <端口>如果不指定端口&#xf…

7-2.递归思想代码练习题

例题1.按顺序打印一个数据的每一位 1234 输出 1 2 3 4 解决问题的思路 如何拿到这个数的每一位 1234%104 1234/10123 123%103 123/1012 12%102 12/101 1%101 递推公式&#xff1a;%10 /10 初始条件&#xff1a;1-9之间的数直接打印&#xff08;n<10&#xff09; n>10 进行…

最近nvm安装报错的原因找到了——npm原淘宝镜像正式到期!

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 错误原因 问题排查 淘宝镜像 证书到期 问题解决 结语 背景 我们…

HAL库配置CAN通信

一、CAN总线波特率计算 CAN总线通信的各节点通信时会产生相位差&#xff0c;所以要进行位同步&#xff0c;两个节点保持步调一致。 CAN_SJW&#xff1a;重新同步跳跃宽度(SJW) 。定义了在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。 CAN_BS1&a…

centos7 安装nacos

在 CentOS 7 上安装 Nacos 的步骤可以概括如下&#xff1a; 前提条件&#xff1a; 安装Java环境&#xff1a;Nacos依赖于Java 8或以上版本&#xff0c;确保系统已安装Java。可以通过以下命令检查和安装&#xff08;假设使用OpenJDK&#xff09;&#xff1a; # 检查是否已安装…

【数据分享】1929-2023年全球站点的逐日最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…

【AudioPolicy To AudioHAL笔记(一)】AudioPolicy启动过程

AudioPolicy启动过程 一、总体启动过程二、代码分析三、动态分析 /*****************************************************************************************************************/ 声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创&#xff0c;转载or…

week03day04(正则表达式2)

一. 正则表达式 1. 匹配次数相关的正则符号 a. 一次或多次(至少一次) &#xff0c;控制 前面元素的次数&#xff0c;看下面事例 from re import fullmatch a 至少一个a , \d 至少一个数字字符 result fullmatch(r1a2,1aaaaaaaa2) #1和2中间至少要有一个a…

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

内网情况配置 wsl 和 vscode。在wsl中下载不了 vscode 的核心。 报错&#xff1a; ERROR: Faild to download https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628c612102e30a681/server-linux-x64/stable 很多情况下是没有现成的VS Code Server程序的&…

三好夫人:真爱战胜一切

真爱如同飞蛾扑火&#xff0c;明知前方是毁灭&#xff0c;却仍心甘情愿地奔赴。如果一个男人真心爱你&#xff0c;他会倾尽所有&#xff0c;不遗余力地满足你的需求。这份爱&#xff0c;会在他的言行举止中流露出来。男人对你的爱&#xff0c;常常表现在他的言语之中。 如果他爱…

桌面显示器应用Type-C接口有什么好处

随着科技的不断发展&#xff0c;桌面显示器作为我们日常工作中不可或缺的设备之一&#xff0c;也在不断更新换代。其中&#xff0c;Type-C接口的应用成为了桌面显示器发展的一个重要趋势。那么&#xff0c;桌面显示器应用Type-C接口究竟有什么好处呢&#xff1f; 首先&#xff…

本地运行面壁智能的“贺岁模型”:MiniCPM 2B

简单聊聊可以在端侧运行的 Mini CPM 2B SFT / DPO 版本的模型。 写在前面 模型是好是坏&#xff0c;其实不用看公众号们的营销&#xff0c;小马过河问题&#xff0c;自己试试就知道了。当然&#xff0c;2B 参数量的模型&#xff0c;适合的场景肯定不是 34B / 70B 所擅长的&am…

VBA_MF系列技术资料1-325

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于…

项目安全问题及解决方法------使用合适的算法

Spring Security 已经废弃了 MessageDigestPasswordEncoder&#xff0c;推荐使用 BCryptPasswordEncoder private static BCryptPasswordEncoder passwordEncoder new BCryptPasswordEncoder(); GetMapping("performance")public void performance() {StopWatch st…

图数据库Neo4j集成springboot及导入数据踩坑问题

文章目录 ----------------------------------常用cql------------------------------------删除所有节点删除指定节点删除所有关系删除指定关系查看所有节点查看某种节点查看总节点数删除所有关系节点删除所有关系 ------------------------------手动导入数据---------------…

android开发---简单购物商城(JAVA) (一)

包括&#xff1a;商品展示&#xff0c;商品详情&#xff0c;购物车&#xff0c;删除&#xff0c;一键清除&#xff0c;返回 运用sqllist 另外因为一篇写不下 继续可看 源码二 下面是目录 运行样子 下面是源码 AndroidManifest.xml <?xml version"1.0" e…